首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环转换应用/plyr

循环转换应用/plyr
EN

Stack Overflow用户
提问于 2016-08-24 15:00:14
回答 2查看 113关注 0票数 1

我编写了以下代码,并希望通过使用plyr或apply来改进它,唉,我似乎无法让它工作。其思想是识别正确的列,然后提取/获取适当的值。

代码语言:javascript
复制
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或应用程序一次通过1行并返回单个值而不是整个列?

谢谢你能提供的任何帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-24 17:28:06

考虑vapply()seq_along(),它允许您指定输出,这里是一个数字向量:

代码语言:javascript
复制
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 

如果需要向dataframe添加列,只需分配它:

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2016-08-24 15:10:32

我认为我们可以从adply包中使用plyr

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39126875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档