我有如下数据:

> 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填充。

例如GregTomSimMoham的值应在名称Bicycle的一行中。

预期产量;

我们有4个属于Bicycle组的成员。每个成员都有8个值= 8列。因此,作为输出,我们应该具有row.name = Bicycle和32列,其值来自这4个成员。我们应该对所有小组都这样做。

编辑:

因此,我期望发布类似RechlayWietze314的内容。有什么方法可以删除那些NA值,并使列数最多达到最大成员数乘以8。我不在乎colnames以及值/列的来源。

最佳答案

使用tidyr函数gatherspread:

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/

10-12 17:10