使用`dplyr`

时间:2016-01-29 00:09:02

标签: r

所以我正在使用问卷调查数据,其中有很多列需​​要为每一行求和才能得分。 (即,我们有每个参与者的行和一些列,这些列都对应于关于例如冒险的度量的不同问题。)

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)
)

(在我的实际数据集中,有相当多的列不相关,而且在问卷调查方面也更多。但这应该足够了。)

现在我想做两件事:

  1. 重新编码某些项目。
  2. 之后,将所有项目相加。
  3. 我显然可以用一种非常简单的方式做到这一点,例如:

    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"))非常简单。

0 个答案:

没有答案