R 使用mutate_at和sum函数按特定列求和行值?
我有一个包含调查问卷数据的数据表,所以第一列是参与者ID,后面是每个调查问卷中以独立问题为首的列。例如,数据表如下所示,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…的总和,以此
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
…的总和,以此类推。但是我的数据表中有很多问卷(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))