【发布时间】:2020-09-17 13:00:33
【问题描述】:
我有一个数据框,其中几列具有相似的信息,我想将它们折叠成更少的列。这似乎与 pivot_long 或 collect 的正常使用有点不同,我被卡住了。我的第一个想法是制作 3 个单独的集合和行绑定.. 但我认为这里有人会有更优雅的解决方案!
df<-data.frame("PicID"=letters[1:8],
"Near_Species1" = c("bird","bird", "bird", "dog", "dog", "human", "none", "human"),
"Count1" = c(1,1,1,1,2,1,0,1),
"Near_Species2" = c(NA,"human", NA, NA, "human", NA, NA, NA),
"Count2" = c(NA,1, NA, NA, 1, NA, NA, NA),
"Far_Species"=c(NA, NA, NA,NA, NA, NA, NA, "bird"))
我想用
的基本结构来延长这个时间PicID NearorFar Species Count
我希望基于 Near_Species1 每张图片至少有 1 行,无论那里有什么(无、NA 等)。
如果在 Near_Species2、Count2 或 Far_Species 中有“无”以外的任何物种,我想要另一行。本质上,物种的“无”是 NA。但我希望至少有 1 行来跟踪该 ID。
输出看起来像这样,但删除了 species 为 NA 的行。
df_out <- data.frame(
"PicID" = c("a", "b", "c", "d", "e", "f", "g", "h",
"a", "b", "c", "d", "e", "f", "g", "h",
"a", "b", "c", "d", "e", "f", "g", "h"),
"NearorFar"=rep(c("Near", "Far"),times=c(16, 8)),
"Species"= paste(c("bird","bird", "bird", "dog", "dog", "human", "none", "human",
NA,"human", NA, NA, "human", NA, NA, NA,
NA, NA, NA,NA, NA, NA, NA, "bird")),
"Count"= c(1,1,1,1,2,1,0,1,
NA,1, NA, NA, 1, NA, NA, NA,
rep(NA, 8))
)
【问题讨论】:
-
你需要
df %>% pivot_longer(cols = matches('Species'), names_to = 'NearorFar', values_to = 'Species') %>% mutate(NearorFar = str_remove(NearorFar, "_.*")) %>% pivot_longer(cols = starts_with('Count'), names_to = NULL, values_to = 'Count', values_drop_na = TRUE) %>% distinct -
让我快速尝试一下,我意识到如果我将 NearSpecies2 和 FarSpecies 的“none”更改为 NAs 会更容易(最后更容易梳理)。
-
是的,改成NA的“none”会在
values_drop_na领取 -
行得通!我发现 "names_to = Null" 给了我错误: "Error: The LHS of
:=must be a string or a symbol" 。但是,如果我只是给它起了一个名字,然后再删除它,那效果很好。太感谢了!我整个下午都被挂断了!!! -
啊哈,会更新的。谢谢!
标签: r tidyr data-manipulation