我已经编写了以下代码,并希望通过使用plyr或apply来改进它,唉,我似乎无法让它工作。我们的想法是确定正确的列,然后提取/获取适当的值。
df <- data.frame(ID=c(1,2,3,4,5),COUNTRY=c('NL','FR','NL','BE','NL'),
NL_GEN=c(5,5,10,20,5),FR_GEN=c(15,10,10,25,5),BE_GEN=c(10,10,5,15,5))
col_sel <- vector('numeric',length=nrow(df))
for ( i in 1:nrow(df)) {
col_sel[i] <- as.numeric(df[i,grep(paste(df$COUNTRY[i],"_GEN",sep = ""),names(df))])
}
我如何使用plyr或apply一次传递1行并返回单个值而不是整列?
感谢您提供的任何帮助。
答案 0 :(得分:0)
我认为我们可以使用adply
包中的plyr
:
library(plyr)
adply(df, 1, function(x) c(Result = x[,which(grepl(x$COUNTRY, names(x)))]))
# ID COUNTRY NL_GEN FR_GEN BE_GEN Result
# 1 1 NL 5 15 10 5
# 2 2 FR 5 10 10 10
# 3 3 NL 10 10 5 10
# 4 4 BE 20 25 15 15
# 5 5 NL 5 5 5 5
答案 1 :(得分:0)
考虑使用vapply()
seq_along()
允许您指定输出,此处为数字向量:
new_col_sel <- vapply(seq_along(df), function(i) {
df[i, grep(paste0(df$COUNTRY[i], "_GEN"), names(df))]
}, numeric(1))
new_col_sel
# [1] 5 10 10 15 5
all.equal(col_sel, new_col_sel)
# [1] TRUE
如果需要向数据框添加列,只需指定它:
df$col_sel <- vapply(seq_along(df), function(i) {
df[i, grep(paste0(df$COUNTRY[i], "_GEN"), names(df))]
}, numeric(1))
# ID COUNTRY NL_GEN FR_GEN BE_GEN col_sel
# 1 1 NL 5 15 10 5
# 2 2 FR 5 10 10 10
# 3 3 NL 10 10 5 10
# 4 4 BE 20 25 15 15
# 5 5 NL 5 5 5 5