R中的组列和总和值

时间:2014-12-08 15:45:02

标签: r

我有一个看起来像这样的数据集

Variable    A1  A2  A3  B1  B2  B3  
Item 1  Men 1   3   3   1   2   3
Item 2  Men 1   3   3   1   2   3
Item 1  Men 1   3   3   1   2   3   
Item 3  Men 2   1   2   5   3   3
Item 2  Men 1   3   3   1   2   3

我需要将列A1, A2, A3归为AB1,B2,B3归为B,之后我想对这些值求和。

我如何在R?

中执行此操作

3 个答案:

答案 0 :(得分:2)

如果您只需为少数变量执行此操作,则可以执行以下操作:

df$A <- rowSums(df[grep("^A\\d+$", names(df))])
df$B <- rowSums(df[grep("^B\\d+$", names(df))])
df[!names(df) %in% grep("^[A-Z]{1}\\d+$", names(df), value = TRUE)]
df
#  Variable Sex A  B
#1   Item_1 Men 7  6
#2   Item_2 Men 7  6
#3   Item_1 Men 7  6
#4   Item_3 Men 5 11
#5   Item_2 Men 7  6

(我称之为“MEN”专栏,因为看起来列名太少了。)

我上面写的grep()命令使用正则表达式。例如,"^A\\d+$"匹配那些以“A”开头,后跟任意数字位数的列名。 grep命令返回找到这些匹配的索引(在列名中),因此rowSums只会添加正确的列。

在第三行中使用了一个非常相似的概念来删除格式为的列:任何单个大写字母(A到Z)后跟任意数量的数字都将被删除。

答案 1 :(得分:0)

test.df$A <- test.df$A1 + test.df$A2 + test.df$A3

和B相同。此代码只会在您的数据框中创建一个名为A的新变量。

答案 2 :(得分:0)

如果您有many个群组,则可以将wide格式转换为long格式,然后进行必要的计算。以下是使用dplyr

的一种方法
library(dplyr)
library(tidyr)

df$indx <- 1:nrow(df)

df %>% 
   gather(Var, Val, -Variable,-indx) %>%
   extract(Var, c('Var1', 'Var2'), '(.)(.)') %>% 
   group_by(Variable, indx, Var1) %>%
   summarise(Val=sum(Val)) %>%
   ungroup() %>%
   spread(Var1, Val) %>% 
   arrange(indx)

#     Variable indx A  B
#1 Item 1  Men    1 7  6
#2 Item 2  Men    2 7  6
#3 Item 1  Men    3 7  6
#4 Item 3  Men    4 5 11
#5 Item 2  Men    5 7  6

或另一种选择是将MaprowSums

一起使用
 indx <- sub('\\d+', '', colnames(df)[-1])
 lst <- split(colnames(df)[-1],indx)
 df1 <- df[1]
 Un <- unique(indx)
 df1[Un] <- Map(function(x,y) rowSums(x[y], na.rm=TRUE),
                                                     list(df), lst)
 df1
 #     Variable A  B
 #1 Item 1  Men 7  6
 #2 Item 2  Men 7  6
 #3 Item 1  Men 7  6
 #4 Item 3  Men 5 11
 #5 Item 2  Men 7  6

或者如果列是ordered即。 A1, A2,A3后跟B1, B2, B3等,每组的列数相同。 (相应地更改dim

 df1[Un] <- apply(array(as.matrix(df[-1]), 
                              dim=c(nrow(df),3,length(Un))), c(1,3), sum)

数据

df <-  structure(list(Variable = c("Item 1  Men", "Item 2  Men", "Item 1  Men", 
"Item 3  Men", "Item 2  Men"), A1 = c(1L, 1L, 1L, 2L, 1L), A2 = c(3L, 
3L, 3L, 1L, 3L), A3 = c(3L, 3L, 3L, 2L, 3L), B1 = c(1L, 1L, 1L, 
5L, 1L), B2 = c(2L, 2L, 2L, 3L, 2L), B3 = c(3L, 3L, 3L, 3L, 3L
)), .Names = c("Variable", "A1", "A2", "A3", "B1", "B2", "B3"
), class = "data.frame", row.names = c(NA, -5L))