我有一个看起来像这样的数据集
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
归为A
,B1,B2,B3
归为B
,之后我想对这些值求和。
我如何在R?
中执行此操作答案 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
或另一种选择是将Map
与rowSums
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))