Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R以类似字符串开头的不同列组的行总和_R_Rowsum - Fatal编程技术网

R以类似字符串开头的不同列组的行总和

R以类似字符串开头的不同列组的行总和,r,rowsum,R,Rowsum,我对R很陌生,这是我第一次敢于在这里提问 我正在使用一个带有likert scales的数据集,我想在不同的列组上求和,这些列共享其名称中的第一个字符串 下面我构建了一个只有两行的数据框来说明我所采用的方法,尽管我希望收到关于如何编写更有效的方法的反馈 df <- as.data.frame(rbind(rep(sample(1:5),4),rep(sample(1:5),4))) var.names <- c("emp_1","emp_2","emp_3","emp_4","sa

我对R很陌生,这是我第一次敢于在这里提问

我正在使用一个带有likert scales的数据集,我想在不同的列组上求和,这些列共享其名称中的第一个字符串

下面我构建了一个只有两行的数据框来说明我所采用的方法,尽管我希望收到关于如何编写更有效的方法的反馈

df <- as.data.frame(rbind(rep(sample(1:5),4),rep(sample(1:5),4)))

var.names <- c("emp_1","emp_2","emp_3","emp_4","sat_1","sat_2"
           ,"sat_3","res_1","res_2","res_3","res_4","com_1",
           "com_2","com_3","com_4","com_5","cap_1","cap_2",
           "cap_3","cap_4")

names(df) <- var.names

df一种可能的解决方案是使用基本R
rowsum
函数(使用
set.seed(123)
)转置
df
,并计算正确列的和


同意MrFlick的说法,您可能希望将数据放在长格式中(请参见
restrape2
tidyr
),但要回答您的问题:

cbind(
  df, 
  sapply(split.default(df, sub("_.*$", "_t", names(df))), rowSums)
)

如果你把你的数据放进数据库,从长远来看,你会过得更好。问题是数据的格式很宽,而不是很长。变量名,例如,
emp_1
,实际上是两个独立的数据段:人员的类别和人员的ID号(或类似的东西)。以下是解决dplyr和tidyr问题的方法

library(dplyr)
library(tidyr)
df %>% 
  gather(key, value) %>% 
  extract(key, c("class", "id"), "([[:alnum:]]+)_([[:alnum:]]+)") %>% 
  group_by(class) %>% 
  summarize(class_sum = sum(value))
首先,我们使用
gather()
将数据帧从宽格式转换为长格式。然后我们使用
extract()
将值
emp_1
拆分为单独的列
class
id
。最后,我们按类分组,并对每个类中的值求和。结果:

Source: local data frame [5 x 2]

  class class_sum
1   cap        26
2   com        30
3   emp        23
4   res        22
5   sat        19

好吧,如果这是一个你需要经常做的操作,听起来你的数据是在错误的形状。使用“长”格式的数据比使用当前的“宽”格式更容易。如果你想做的话,还有很多关于重塑的问题。哦,太接近了。。。我想我更喜欢你的(+1)@BrodieG不知道,我在这里用了两次
t
,所以不确定它将如何扩展。(+1)对你也是:)。用
\u t
代替
顺便说一句,这主意不错。谢谢大家的回复。直到现在我还不知道正则表达式是什么,但因为我不明白为什么“.*$”部分起作用,我不得不读了一些书,发现这里不需要$,
cbind(df,t(rowsum(t(df),sub(“.*”,“t)”,names(df k k)
工作得很好。这里每个类应该有两个值。还有,它是如何连接回原始数据的?我看到原始问题是如何得到两个答案的(即每行一个答案)。但看来关键是要总结一下?如果不是,那么这里有一个隐藏变量。在原始df中,需要另一列来指定标识每一行的内容。该列将包含在对
group\u by()
的调用中。合并回原始数据更容易。可以使用
mutate()
代替
summary
添加包含该数据的新列。或者可以
left\u join()
将此新数据帧返回到整理好的数据帧。
library(dplyr)
library(tidyr)
df %>% 
  gather(key, value) %>% 
  extract(key, c("class", "id"), "([[:alnum:]]+)_([[:alnum:]]+)") %>% 
  group_by(class) %>% 
  summarize(class_sum = sum(value))
Source: local data frame [5 x 2]

  class class_sum
1   cap        26
2   com        30
3   emp        23
4   res        22
5   sat        19