1

我有一个数据框,其中包含 3 列 L1、L2、L3 数据和标记为 L1+L2、L2+L3、L3+L1、L1-L2 等列操作组合的空列。有没有办法检查列名并执行必要的操作来用数据填充新列?

我在想: - 使用 match 查找适当的原始列并使用 for 循环遍历此搜索中的所有列?所以如果我试图填充的列是 L1+L2 我会有类似的东西: apply(dataframe[,c(i, j), 1, sum)

4

2 回答 2

3

您将操作存储在列名中似乎很奇怪,但我想可以实现:

与往常一样,样本数据会有所帮助。

## Creating some sample data
mydf <- setNames(data.frame(matrix(1:9, ncol = 3)), 
                 c("L1", "L2", "L3"))

## The operation you want to do...
morecols <- c(
  combn(names(mydf), 2, FUN=function(x) paste(x, collapse = "+")),
  combn(names(mydf), 2, FUN=function(x) paste(x, collapse = "-"))
)

## THE FINAL SAMPLE DATA
mydf[, morecols] <- NA
mydf
#   L1 L2 L3 L1+L2 L1+L3 L2+L3 L1-L2 L1-L3 L2-L3
# 1  1  4  7    NA    NA    NA    NA    NA    NA
# 2  2  5  8    NA    NA    NA    NA    NA    NA
# 3  3  6  9    NA    NA    NA    NA    NA    NA

一种解决方案是使用eval(parse(...))insidelapply来执行计算并将它们存储到相关列。

mydf[morecols] <- lapply(names(mydf[morecols]), function(x) {
  with(mydf, eval(parse(text = x)))
})
mydf
#   L1 L2 L3 L1+L2 L1+L3 L2+L3 L1-L2 L1-L3 L2-L3
# 1  1  4  7     5     8    11    -3    -6    -3
# 2  2  5  8     7    10    13    -3    -6    -3
# 3  3  6  9     9    12    15    -3    -6    -3
于 2013-08-13T18:25:46.473 回答
2
dfrm <- data.frame( L1=1:3, L2=1:3, L3=3+1,  `L1+L2`=NA, 
                   `L2+L3`=NA, `L3+L1`=NA, `L1-L2`=NA, 
                    check.names=FALSE)
dfrm
#------------
  L1 L2 L3 L1+L2 L2+L3 L3+L1 L1-L2
1  1  1  4    NA    NA    NA    NA
2  2  2  4    NA    NA    NA    NA
3  3  3  4    NA    NA    NA    NA
#-------------
 dfrm[, 4:7] <- lapply(names(dfrm[, 4:7]), 
                       function(nam) eval(parse(text=nam), envir=dfrm) )
 dfrm
#-----------
  L1 L2 L3 L1+L2 L2+L3 L3+L1 L1-L2
1  1  1  4     2     5     5     0
2  2  2  4     4     6     6     0
3  3  3  4     6     7     7     0

我选择使用eval(parse(text=...))而不是with,因为with在其帮助页面中特别警告不要使用。不过,我不确定我可以解释为什么eval(..., target_dfrm)表格应该更安全。

于 2013-08-13T18:32:31.717 回答