所以我正在使用问卷调查数据,其中有很多列需要为每一行求和才能得分。 (即,我们有每个参与者的行和一些列,这些列都对应于关于例如冒险的度量的不同问题。)
df <- data.frame(
id = paste(c(1:100), "sub", sep=""),
adventure1a = sample(1:7, 100, replace=T),
adventure2a = sample(1:7, 100, replace=T),
adventure3a = sample(1:7, 100, replace=T),
adventure4b = sample(1:7, 100, replace=T),
adventure5b = sample(1:7, 100, replace=T),
adventure6b = sample(1:7, 100, replace=T),
adventure7a = sample(1:7, 100, replace=T),
adventure8b = sample(1:7, 100, replace=T),
adventure9a = sample(1:7, 100, replace=T),
adventure10b = sample(1:7, 100, replace=T)
)
(在我的实际数据集中,有相当多的列不相关,而且在问卷调查方面也更多。但这应该足够了。)
现在我想做两件事:
我显然可以用一种非常简单的方式做到这一点,例如:
df$adventure1a <- df$adventure1a - 1
但是,如果我重新编码了一半的项目并且有40个项目,那么这将变得更加令人沮丧。因此,我最终使用dplyr
中的select()和colwise()...但我想知道是否有更好的方法:
library(plyr)
library(dplyr)
df2 <- colwise(function (x) x = x - 1)
df2 <- select(df, ends_with("a")) %>% df2
df3 <- colwise(function (x) x = x - 2)
df3 <- select(df, ends_with("b")) %>% df3
df4 <- cbind(id = df$id, df2, df3)
然后,我可以使用apply()
&amp; select()
:
df4$adventurousness <- apply(select(df4, starts_with("adventure")), 1, sum, na.rm=T)
这绝对有效。但它似乎比我想要的更麻烦 - 所以我想知道是否有任何关于改进的想法。它确实比输入一个复杂的sum()
公式更容易,如果没有重新编码,那么最后一行本身就是select(x, starts_with("y"))
非常简单。