因此,我有以下关于巴士站 ID 和经过该站的巴士线路的数据框。
stop_id 20 goes 20 return 21 goes 21 return 22 goes 22 return
C0001 X NA X NA X NA
C0002 NA X NA X NA X
C0003 X NA NA NA X NA
C0004 NA X NA NA NA X
C0005 NA NA X NA X NA
C0006 NA NA NA X NA X
如果线路有一个“X”而不是 NA,则表示该公交线路经过该站,即 20 号线、21 号线和 22 号线都经过 C0001 站。我需要做的是将所有引用该行的列“汇总”到一个名为“行”的新列中。对于每个公交车站,此列将包含经过它的公交车线路。
所以我正在寻找的是一个看起来像这样的数据框:
stop_id lines
C0001 20 goes - 21 goes - 22 goes
C0002 20 return - 21 return - 22 return
C0003 20 goes - 22 goes
C0004 20 return - 22 return
C0005 21 goes - 22 goes
C0006 21 return - 22 return
更多信息:我需要一种通用的方法来做到这一点,因为我的真实数据框有 3709 个公交车站和 90 多条线路。谢谢你。
最佳答案
最简单的方法是遍历行和 paste
非 NA 元素的列名
cbind(df1[1], lines = apply(df1[-1], 1, function(x) paste(names(x)[!is.na(x)],
collapse = ' - ')))
-输出stop_id lines
1 C0001 20 goes - 21 goes - 22 goes
2 C0002 20 return - 21 return - 22 return
3 C0003 20 goes - 22 goes
4 C0004 20 return - 22 return
5 C0005 21 goes - 22 goes
6 C0006 21 return - 22 return
数据df1 <- structure(list(stop_id = c("C0001", "C0002", "C0003", "C0004",
"C0005", "C0006"), `20 goes` = c("X", NA, "X", NA, NA, NA), `20 return` = c(NA,
"X", NA, "X", NA, NA), `21 goes` = c("X", NA, NA, NA, "X", NA
), `21 return` = c(NA, "X", NA, NA, NA, "X"), `22 goes` = c("X",
NA, "X", NA, "X", NA), `22 return` = c(NA, "X", NA, "X", NA,
"X")), class = "data.frame", row.names = c(NA, -6L))
关于r - 将某些列的名称作为数据框每一行的一个单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68446422/