【发布时间】:2018-11-23 22:45:06
【问题描述】:
我有一个由问卷数据组成的数据框,每一列代表问卷中的一个项目。
数据如下所示:
df <- data.frame(Q1a = c(3, 2, 5, 6, 9), Q1b = c(2, 0, -2, 0, 9), Q2a = c(1, 4, 7, 2, 4),
Q2b = c(0, 0, -1, 0, 0), Q3a = c(5, 7, 2, 0, 9), Q3b = c(-2, -2, 3, 6, 9),
Q4a = c(5, 2, 4, 9, 0), Q4b = c(0, 0, -2, -2, -2))
每个问卷项目有两个版本(a、b)。我想选择所有具有“b”后缀的项目。对于那些带有“b”后缀的列,我想将值为 -2 的单元格数除以该特定列中非空白和非 NA 的总数。我想对所有列重复上述过程。我设法用以下代码完成了它:
test <- df %>%
select(ends_with("b")) %>%
mutate_all(funs(round(sum(. == -2)/sum(. != "" | . != NA)*100,
digits = 2)))
由于我知道没有“group_by”等效项适用于列而不是行,因此在上述输出的每一行中都会重复相同的结果。我已经设法使用以下代码删除了带有slice 重复信息的行:
test <- df %>%
select(ends_with("b")) %>%
mutate_all(funs(round(sum(. == -2)/sum(. != "" | . != NA)*100,
digits = 2))) %>%
slice(1)
使用上面的输出,我想继续我的 dplyr 管道,用值 1 替换该行中的最大值,并将所有其他值替换为最大值的百分比。
我有以下内容:
我想要的输出是:
我的两个问题是:
1)。是否有适用于列的 group_by 等效项?如果是这样,我就不用这么笨拙地使用slice了。
2)。有人可以帮我完成我想要的输出的 dplyr 管道吗?我不知道如何从那里开始。
谢谢!
【问题讨论】:
-
如果你把它存储在其他对象比如
df1,你基本上需要df1/apply(df1, 1, max) -
为什么 Q3b 66.67 是您想要的输出?如果那个 nog 是 40(即 5 个值中有 2 个是 -2)