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

R 使用mutate_at和sum函数按特定列求和行值?,r,dplyr,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函数来编码。我在使用mutate_at fromdplyr查找每个ID的每个问卷的汇总分数时遇到问题。我想找到问卷A(来自A1、A2和A3)和B…的总和,以此

我有一个包含调查问卷数据的数据表,所以第一列是参与者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函数来编码。我在使用mutate_at from
dplyr
查找每个
ID
的每个问卷的汇总分数时遇到问题。我想找到问卷
A
(来自
A1
A2
A3
)和
B
…的总和,以此类推。但是我的数据表中有很多问卷(
A
B
C
D
…等等),所以我现在的代码看起来像:

data %>%
  group_by(ID) %>%
  mutate_at(vars(contains("A")), funs(sum)) %>%
  ungroup()
然而,运行此命令总是给我一个错误

错误:参数的“类型”(字符)无效


我不明白为什么。当我尝试对每一个进行变异时,也会发生同样的事情。我怎样才能解决这个问题

我认为一种方法是如下。我可以看到您希望如何使用
mutate_at
处理宽格式数据,但您可能希望在这里选择长格式。那会让你的生活变得轻松。您可以使用
melt
gather
以长格式格式化数据。然后,您要更改列,
变量
。您想删除数字。最后,按
ID
variable
对数据进行分组,得到总和

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
melt(mydf,id.var=“id”)%>%
突变(变量=gsub(模式=“[0-9]+”,替换=“”,x=变量))%>%
分组依据(ID,变量)%>%
汇总(总额=总和(价值))
#ID变量总数
#       
#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之所以很难做到这一点,是因为您没有明确编码问卷类型和编号,因此数据不“整洁”。Jazzurro的方法是正确的,但在这里,我使用了
tidyr
包来处理
collect
separate

library(tidyr)
library(dplyr)

data %>% 
gather(test, tot, A1:B2) %>% 
separate(test, into=c("Q", "No"), sep=1) %>%
group_by(ID, Q) %>% summarise(totals=sum(tot))
这避免了必须使用
gsub


此外,如果希望A和B分别列在不同的列中,您可以将
%%>%的排列(Q,总计)
添加到管道的末尾。

您能解释一下gsub的作用吗?同样对于总和(值),值从何而来?…在
gsub
中,我正在删除数字。例如,A1变为A。如果要可视化该过程,请只运行两行代码,如下所示:melt(mydf,id.var=“id”)%%>%mutate(variable=gsub(pattern=“[0-9]+”,replacement=“”,x=variable))
。同样,我建议您只运行
melt(mydf,id.var=“id”)
。然后,您可以看到
变量
来自何处。提醒您需要重塑2和dplyr包。
library(tidyr)
library(dplyr)

data %>% 
gather(test, tot, A1:B2) %>% 
separate(test, into=c("Q", "No"), sep=1) %>%
group_by(ID, Q) %>% summarise(totals=sum(tot))