我有一个数据框,其中包含 3 列 L1、L2、L3 数据和标记为 L1+L2、L2+L3、L3+L1、L1-L2 等列操作组合的空列。有没有办法检查列名并执行必要的操作来用数据填充新列?
我在想: - 使用 match 查找适当的原始列并使用 for 循环遍历此搜索中的所有列?所以如果我试图填充的列是 L1+L2 我会有类似的东西: apply(dataframe[,c(i, j), 1, sum)
我有一个数据框,其中包含 3 列 L1、L2、L3 数据和标记为 L1+L2、L2+L3、L3+L1、L1-L2 等列操作组合的空列。有没有办法检查列名并执行必要的操作来用数据填充新列?
我在想: - 使用 match 查找适当的原始列并使用 for 循环遍历此搜索中的所有列?所以如果我试图填充的列是 L1+L2 我会有类似的东西: apply(dataframe[,c(i, j), 1, sum)
您将操作存储在列名中似乎很奇怪,但我想可以实现:
与往常一样,样本数据会有所帮助。
## 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
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)
表格应该更安全。