我有一个包含调查问卷数据的数据表,因此第一列是参与者 ID,后面是每个调查问卷的以单独问题为标题的列。例如,数据表如下所示,其中 A
是一份调查问卷,B
是另一份调查问卷:
ID A1 A2 A3 B1 B2
1 3 5 3 4 2
2 2 5 2 2 1
3 4 1 3 4 1
4 3 2 3 3 2
我想使用 dplyr 函数对此进行编码。我在使用 dplyr
中的 mutate_at 查找每个 ID
每个调查问卷的汇总分数时遇到问题。我想查找调查问卷 A
(来自 A1
、A2
和 A3
)的总和,以及B
...等等。但我的数据表中有很多调查问卷(A
、B
、C
、D
......等)所以我的代码现在看起来像:
data %>%
group_by(ID) %>%
mutate_at(vars(contains("A")), funs(sum)) %>%
ungroup()
但是运行这个总是给我一个错误
Error: invalid 'type' (character) of argument
我不明白为什么。当我尝试 mutate_each
时,也会发生同样的情况。我该如何解决这个问题?
最佳答案
我认为一种方法如下。我可以看到您希望如何使用 mutate_at
处理宽格式数据,但您可能希望在此处选择长格式。这会让你的生活变得轻松。您可以使用 melt
或 gather
将数据格式化为长格式。然后,您想要更改列变量
。您想要删除数字。最后,按 ID
和 变量
对数据进行分组并获取总和。
melt(mydf, id.var = "ID") %>%
mutate(variable = gsub(pattern = "[0-9]+", replacement = "", x = variable)) %>%
group_by(ID, variable) %>%
summarise(total = sum(value))
# ID variable total
# <int> <chr> <int>
#1 1 A 11
#2 1 B 6
#3 2 A 9
#4 2 B 3
#5 3 A 8
#6 3 B 5
#7 4 A 8
#8 4 B 5
数据
mydf <- structure(list(ID = 1:4, A1 = c(3L, 2L, 4L, 3L), A2 = c(5L, 5L,
1L, 2L), A3 = c(3L, 2L, 3L, 3L), B1 = c(4L, 2L, 4L, 3L), B2 = c(2L,
1L, 1L, 2L)), .Names = c("ID", "A1", "A2", "A3", "B1", "B2"), class = "data.frame", row.names = c(NA,
-4L))
关于r - 使用 mutate_at 和 sum 函数按特定列求和行值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39801835/