2015-08-07 3 views
-1

У меня есть dataframe:Объединение переменных в кадре данных на основе уровней факторов из другого фрейма данных

head(Diets) 
    Sp1 Sp2 Sp3 Sp4 Sp5 
1 0.4 0.4 0.1 0.2 0.0 
2 1.4 0.1 0.1 0.3 3.4 
3 0.5 0.6 0.1 0.4 0.0 
.... 

Я хотел бы создать новый dataframe, который суммирует эти значения на основе их членства в группах (фактор) из другого dataframe:

head(Groups)  
    SpName GroupName 
1 Sp1  Grp1 
2 Sp2  Grp1 
3 Sp3  Grp2 
4 Sp4  Grp3 
5 Sp5  Grp3 
.... 

, чтобы получить это:

Grp1 Grp2 Grp3 
1 0.8 0.1 0.2 
2 1.5 0.1 3.7 
3 1.1 0.1 0.4 
+0

Пожалуйста, укажите * воспроизводимый пример. –

+0

Это может быть хороший вопрос, просто нужен минимальный воспроизводимый пример. –

+0

Хотя, возможно, неясно, показанные части являются жизнеспособным примером. –

ответ

2

Вы могли делать aggregate функция это с помощью базового R в

Шаг1 Соединенный оба data.frames

data = data.frame(cbind(df1, t(df2))) 

Шаг2 выполнить суммирование значений, соответствующих каждой группе

out = aggregate(cbind(X1, X2, X3) ~ V3 , data, sum) 

Step3 поместите результат по желанию путем транспонирования и установки имен столбцов с помощью setNames

setNames(data.frame(t(out[,-1]),row.names = NULL), out[,1]) 

# Grp1 Grp2 Grp3 
#1 0.8 0.1 0.2 
#2 1.5 0.1 3.7 
#3 1.1 0.1 0.4 

данные

df1 = structure(list(V1 = 1:5, V2 = structure(1:5, .Label = c("Sp1", 
"Sp2", "Sp3", "Sp4", "Sp5"), class = "factor"), V3 = structure(c(1L, 
1L, 2L, 3L, 3L), .Label = c("Grp1", "Grp2", "Grp3"), class = "factor")), .Names = c("V1", 
"V2", "V3"), class = "data.frame", row.names = c(NA, -5L)) 

df2 = structure(list(Sp1 = c(0.4, 1.4, 0.5), Sp2 = c(0.4, 0.1, 0.6), 
    Sp3 = c(0.1, 0.1, 0.1), Sp4 = c(0.2, 0.3, 0.4), Sp5 = c(0, 
    3.4, 0)), .Names = c("Sp1", "Sp2", "Sp3", "Sp4", "Sp5"), class = "data.frame", row.names = c("1", 
"2", "3")) 
1
groups <- read.table(header = TRUE, stringsAsFactors = FALSE, 
text="SpName GroupName 
1 Sp1  Grp1 
2 Sp2  Grp1 
3 Sp3  Grp2 
4 Sp4  Grp3 
5 Sp5  Grp3") 

diets <- read.table(header = TRUE, 
text="Sp1 Sp2 Sp3 Sp4 Sp5 
1 0.4 0.4 0.1 0.2 0.0 
2 1.4 0.1 0.1 0.3 3.4 
3 0.5 0.6 0.1 0.4 0.0") 

Если COLNAMES диет в том же порядке, как и в данных группах, вы можете просто использовать это. В противном случае match будет более безопасным

# names(diets) <- groups$GroupName 
names(diets) <- groups$GroupName[match(names(diets), groups$SpName)] 

sapply(split(names(diets), names(diets)), function(x) 
    rowSums(diets[, names(diets) %in% x, drop = FALSE])) 

# Grp1 Grp2 Grp3 
# 1 0.8 0.1 0.2 
# 2 1.5 0.1 3.7 
# 3 1.1 0.1 0.4 
Смежные вопросы