R类似的列名称ifelse

时间:2014-07-01 02:58:07

标签: r if-statement

根据答案建议添加可重现的代码

Qs<-paste0("Q2_", 1:18)

set.seed(15)
maindata <- data.frame(ID=1:5)
for(q in Qs) {
    maindata[,q] <- sample(1:20,5,replace=T)
} 

我有以下代码。如果不写每一行就能更好地实现输出吗?如果我想编写for循环来迭代问题1到18但是觉得for循环可能效率不高......

  ifelse(maindata$Q2_1  > 2 & maindata$Q2_1< 11 & !is.na(maindata$Q2_1), 1, 0 )+
  ifelse(maindata$Q2_2  > 2 & maindata$Q2_2< 11 & !is.na(maindata$Q2_2), 1, 0)+
  ifelse(maindata$Q2_3  > 2 & maindata$Q2_3< 11 & !is.na(maindata$Q2_3), 1, 0)+
  ifelse(maindata$Q2_4  > 2 & maindata$Q2_4< 11 & !is.na(maindata$Q2_4), 1, 0)+
  ifelse(maindata$Q2_5  > 2 & maindata$Q2_5< 11 & !is.na(maindata$Q2_5), 1, 0)+
  ifelse(maindata$Q2_6  > 2 & maindata$Q2_6< 11 & !is.na(maindata$Q2_6), 1, 0)+
  ifelse(maindata$Q2_7  > 2 & maindata$Q2_7< 11 & !is.na(maindata$Q2_7), 1, 0)+
  ifelse(maindata$Q2_8  > 2 & maindata$Q2_8< 11 & !is.na(maindata$Q2_8), 1, 0)+
  ifelse(maindata$Q2_9  > 2 & maindata$Q2_9< 11 & !is.na(maindata$Q2_9), 1, 0)+
  ifelse(maindata$Q2_10  > 2 & maindata$Q2_10< 11 & !is.na(maindata$Q2_10), 1, 0)+
  ifelse(maindata$Q2_11  > 2 & maindata$Q2_11< 11 & !is.na(maindata$Q2_11), 1, 0)+
  ifelse(maindata$Q2_12  > 2 & maindata$Q2_12< 11 & !is.na(maindata$Q2_12), 1, 0)+
  ifelse(maindata$Q2_13  > 2 & maindata$Q2_13< 11 & !is.na(maindata$Q2_13), 1, 0)+
  ifelse(maindata$Q2_14  > 2 & maindata$Q2_14< 11 & !is.na(maindata$Q2_14), 1, 0)+
  ifelse(maindata$Q2_15  > 2 & maindata$Q2_15< 11 & !is.na(maindata$Q2_15), 1, 0)+
  ifelse(maindata$Q2_16  > 2 & maindata$Q2_16< 11 & !is.na(maindata$Q2_16), 1, 0)+
  ifelse(maindata$Q2_17  > 2 & maindata$Q2_17< 11 & !is.na(maindata$Q2_17), 1, 0)+
  ifelse(maindata$Q2_18  > 2 & maindata$Q2_18< 11 & !is.na(maindata$Q2_18), 1, 0)

1 个答案:

答案 0 :(得分:1)

嗯,这是一种方式。首先,让我们创建一些示例数据

Qs<-paste0("Q2_", 1:18)

set.seed(15)
maindata <- data.frame(ID=1:5)
for(q in Qs) {
    maindata[,q] <- sample(1:20,5,replace=T)
}

这里我们列出了所有问题名称(Qs),我们创建了一个包含5行的data.frame,其中每列包含从1:20采样的值。如果我们想要每个人的每一行得分,我们可以做

score <- rowSums(sapply(Qs, function(q) 
    maindata[,q] > 2 & maindata[,q] <11 & !is.na(maindata[,q]) )+0)

这里我使用sapply迭代问题名称。然后我写了一次公式并交换了不同的问题名称。在这里,我返回一个简单的逻辑值,并添加零以将FALSE转换为0并将TRUE转换为1.然后,我使用rowSums来应用跨行的分数。我们可以用

看到结果
cbind(maindata[,"ID", drop=F], score)

#   ID score
# 1  1     9
# 2  2     8
# 3  3     4
# 4  4     6
# 5  5    10