For Loop conversion to apply / plyr

时间:2016-08-24 15:00:14

标签: r for-loop apply plyr

我已经编写了以下代码,并希望通过使用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行并返回单个值而不是整列?

感谢您提供的任何帮助。

2 个答案:

答案 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