R-对列执行操作,并将结果放在不同的列中,操作由输出列指定';姓名
我有一个数据框,它有3列数据——L1、L2、L3,以及标记为L1+L2、L2+L3、L3+L1、L1-L2等的空列。这些是列操作的组合。是否有方法检查列名并执行必要的操作以用数据填充新列 我在想: -使用match查找适当的原始列,并使用for循环迭代此搜索中的所有列? 因此,如果我试图填充的列是L1+L2,我会有如下内容:R-对列执行操作,并将结果放在不同的列中,操作由输出列指定';姓名,r,R,我有一个数据框,它有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
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
将操作存储在列名中似乎很奇怪,但我认为可以实现: 和往常一样,示例数据很有帮助
## 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
dfrmdfrm您可以使用strsplit
您可以使用strsplit
哇,谢谢!关于语法的快速问题-因此eval只计算表达式,所以您使用parse从字符串创建表达式?@user1292636,非常好。parse
的输出是一个表达式,但它没有计算,嗯需要eval
。哇,谢谢!关于语法的快速问题-因此eval只计算表达式,所以您使用parse从字符串创建表达式?@user2631296,非常好。parse
的输出是一个表达式
,但它没有计算,因此需要eval
。
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