r - 使用 mutate_at 和 sum 函数按特定列求和行值?

标签 r dplyr

我有一个包含调查问卷数据的数据表,因此第一列是参与者 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(来自 A1A2A3)的总和,以及B...等等。但我的数据表中有很多调查问卷(ABCD......等)所以我的代码现在看起来像:

data %>%
  group_by(ID) %>%
  mutate_at(vars(contains("A")), funs(sum)) %>%
  ungroup()

但是运行这个总是给我一个错误

Error: invalid 'type' (character) of argument

我不明白为什么。当我尝试 mutate_each 时,也会发生同样的情况。我该如何解决这个问题?

最佳答案

我认为一种方法如下。我可以看到您希望如何使用 mutate_at 处理宽格式数据,但您可能希望在此处选择长格式。这会让你的生活变得轻松。您可以使用 meltgather 将数据格式化为长格式。然后,您想要更改列变量。您想要删除数字。最后,按 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/

相关文章:

r - 使用 or_glm() 函数调整优势比?

r - dplyr bind_rows 执行时间指数

r - 给定列的最小值,在另一列中找到最小值(dplyr)

r - 一起使用dplyr的summarise_each吗?

r - 如何在空间上将不同系列的地毯图分开

r - 使用 dplyr 对多列求和时忽略 NA

R Shiny - 如何使用操作按钮在两个不同的绘图之间切换

r - 使用 case_when() 分配两个新列,而不是一个

r - 如何删除两列中以相反顺序包含相同对的行

r - 尝试加入 dplyr 时出现损坏警告