我有如下数据:
> dput(test_data)
structure(list(`10` = c(0, 0, 0, 0, 0, 1, 0.22123412423, 0.0123915695,
0.0126915225, 0.4312, 1), `34` = c(0, 0, 0, 0, 0, 0.323256312,
0.32423561, 0.44451256, 0.33623498, 0.21341411, 0.321223), `59` = c(0.232,
0.57192, 0, 0, 0, 0.31312334, 0.2775713, 0.1311453, 0.63215713,
0.4423123, 0.132212), `84` = c(1, 1, 1, 0, 1, 0, 1, 1, 1, 1,
0), `110` = c(0.55345123, 0.689875, 0.423415551, 1, 0.444532121,
0, 0.01186404, 0.22132204, 0.21186404, 0, 0), `134` = c(0.234126,
0.33347267, 0.35321234, 0.4123412, 0.333412666, 0, 0, 0, 0.3123,
0, 0), `165` = c(0.1147189, 0.12343, 0.3155, 0.2755712, 0.123,
0, 0, 0, 0, 0, 0), `199` = c(0.1236836, 0.0058933, 0, 0.1344607,
0, 0, 0, 0, 0, 0, 0), Group = c("Train", "Bicycle", "Car", "Bicycle",
"Bicycle", "Car", "Bicycle", "Train", "Car", "Train", "Train"
)), .Names = c("10", "34", "59", "84", "110", "134", "165", "199",
"Group"), row.names = c("Mark_1", "Greg_1", "Tim_1", "Tom_1",
"Sim_1", "Karl_1", "Moham_1", "Teraq_1", "Jake_1", "Sonya_1",
"Monique_1"), class = "data.frame")
我想从相同的
Group
中获取行,并将它们合并为一行。在这种情况下,row.name并不重要。作为行名,应使用组。当然,某些组的成员更多(尤其是在我的真实数据中),因此特定列中的缺失值应使用NA's
填充。例如
Greg
,Tom
,Sim
,Moham
的值应在名称Bicycle
的一行中。预期产量;
我们有4个属于
Bicycle
组的成员。每个成员都有8个值= 8列。因此,作为输出,我们应该具有row.name = Bicycle和32列,其值来自这4个成员。我们应该对所有小组都这样做。编辑:
因此,我期望发布类似
Rechlay
和Wietze314
的内容。有什么方法可以删除那些NA
值,并使列数最多达到最大成员数乘以8。我不在乎colnames
以及值/列的来源。 最佳答案
使用tidyr
函数gather
和spread
:
library(tidyr)
library(dplyr)
result <- test_data %>% mutate(person = row.names(test_data)) %>%
gather(key, value, -Group, -person) %>%
mutate(column = paste0(person,'_',key)) %>%
select(column, Group, value) %>%
spread(column, value)
但是最终您将得到比预期更多的列,因此也许您可以给我们预期的输出(如评论中所述)。
编辑:
要获得每人8列的使用:
result <- test_data %>% mutate(person = row.names(test_data)) %>%
gather(key, value, -Group, -person) %>%
group_by(Group, person) %>%
mutate(column = paste0(person,'_',row_number(key))) %>%
ungroup() %>%
select(column, Group, value) %>%
spread(column, value)
最后,如果您只希望32列而不关心哪个值来自哪个人,则可以使用:
result <- test_data %>% mutate(person = row.names(test_data)) %>%
gather(key, value, -Group, -person) %>%
group_by(Group) %>% arrange(person, key) %>%
mutate(column = row_number()) %>%
ungroup() %>%
select(column, Group, value) %>%
spread(column, value)
要从数据框中删除NA值,请使用:
result[is.na(result)] <- 0
关于r - 根据一列中的字符串组合行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42001025/