【问题标题】:R pivot_longer combining several columnsR pivot_longer 结合了几列
【发布时间】: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 %&gt;% pivot_longer(cols = matches('Species'), names_to = 'NearorFar', values_to = 'Species') %&gt;% mutate(NearorFar = str_remove(NearorFar, "_.*")) %&gt;% pivot_longer(cols = starts_with('Count'), names_to = NULL, values_to = 'Count', values_drop_na = TRUE) %&gt;% 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


【解决方案1】:

我们可以使用pivot_longer

library(dplyr)
library(tidyr)
library(stringr)
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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-13
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    相关资源
    最近更新 更多