如何使用 R 将每天 1 列的数据集转换为仅 1 个日期列(天)

How do I convert a dataset with 1 column per day to only 1 date column (days) with R

我有一个鸟类观察数据集。我每个月的每一天都有一列 (31)。如果这只鸟在这一天被看到,它就会有“地点”信息(它被看到的地方)。有人可以帮助我们使用可以将这 31 列(天)合并到 one 日期列和另一个带有“地点”信息的第二列的代码吗?我想我可以使用“reshape2”包中的“dcast”功能,但我不知道如何使用它来保留这两个信息(日期和地点)。

这是我的数据集的结构:

    bird_data = structure(
  list(
    ID = c(
      "FB37461",
      "FA42342",
      "FA42261",
      "FB37329",
      "FA42332",
      "FH60963",
      "FB37473",
      "FB37593",
      "FA85545",
      "FC10619"
    ),
    Name = c(
      "Dekort",
      "Simon",
      "Devil",
      "Chimere",
      "Private Norman",
      "Aurresku",
      "Rombus",
      "Tan?",
      "Taiwan",
      "Bakugo"
    ),
    Lring = c("",
              "ID/RD", "", "DB", "", "YL/WT", "", "", "", "ID/DG"),
    Rring = c("",
              "DB", "", "MV/ID", "", "ID", "", "", "", "O"),
    sex = c("M", "F",
            "F", "U", "F", "F", "U", "J", "F", "J"),
    month = c(
      "October",
      "December",
      "July",
      "April",
      "November",
      "November",
      "March",
      "April",
      "August",
      "March"
    ),
    year = c(
      2016L,
      2018L,
      2015L,
      2018L,
      2016L,
      2018L,
      2015L,
      2015L,
      2016L,
      2018L
    ),
    seen = c(1L, 0L, 1L,
             1L, 1L, 0L, 0L, 1L, 1L, 1L),
    Freq = c(13L, 0L, 9L, 10L, 4L, 0L,
             0L, 7L, 5L, 14L),
    `1` = c("S", "", "A", "", "", "", "", "", "",
            "AS"),
    `2` = c("", "", "", "", "", "", "", "", "", "A"),
    `3` = c("",
            "", "", "A", "", "", "", "", "", ""),
    `4` = c("S", "", "", "A",
            "S", "", "", "", "", ""),
    `5` = c("S", "", "", "A", "", "", "",
            "", "", ""),
    `6` = c("", "", "", "", "", "", "", "", "", "A"),
    `7` = c("S", "", "", "", "", "", "", "A", "", "A"),
    `8` = c("",
            "", "A", "", "", "", "", "A", "", "S"),
    `9` = c("", "", "",
            "", "", "", "", "", "", "A"),
    `10` = c("", "", "A", "A",
             "", "", "", "A", "", ""),
    `11` = c("", "", "", "", "", "",
             "", "A", "", ""),
    `12` = c("A", "", "", "A", "", "", "",
             "", "", ""),
    `13` = c("S", "", "", "AS", "", "", "", "",
             "", "A"),
    `14` = c("", "", "AF", "", "", "", "", "A", "",
             "S"),
    `15` = c("", "", "A", "", "", "", "", "", "", ""),
    `16` = c("", "", "A", "", "S", "", "", "A", "", "S"),
    `17` = c("",
             "", "A", "A", "", "", "", "A", "F", ""),
    `18` = c("AS", "",
             "A", "", "S", "", "", "", "", ""),
    `19` = c("", "", "", "",
             "", "", "", "", "", ""),
    `20` = c("S", "", "", "A", "", "",
             "", "", "", "S"),
    `21` = c("S", "", "", "", "", "", "", "",
             "", ""),
    `22` = c("", "", "", "", "", "", "", "", "", "S"),
    `23` = c("", "", "", "", "", "", "", "", "A", ""),
    `24` = c("",
             "", "", "", "S", "", "", "", "", ""),
    `25` = c("S", "", "",
             "", "", "", "", "", "S", ""),
    `26` = c("S", "", "", "A",
             "", "", "", "", "F", ""),
    `27` = c("F", "", "", "A", "",
             "", "", "", "", "S"),
    `28` = c("S", "", "", "", "", "", "",
             "", "", ""),
    `29` = c("", "", "A", "", "", "", "", "", "",
             "S"),
    `30` = c("", "", "", "", "", "", "", "", "AF", "S"),
    `31` = c("", "", "", "", "", "", "", "", "", "")
  ),
  row.names = c(
    11419L,
    21637L,
    7186L,
    17878L,
    11678L,
    21385L,
    6290L,
    6640L,
    10785L,
    17740L
  ),
  class = "data.frame"
)

例如,在第 9 行,我们有“台湾”,在 2016 年 8 月有 5 次观察。她出现在 17 日、23 日、25 日、26 日、30 日。所以我想做 5 行(5 次观察),其中一列用于日期,另一列用于所见地点(F、A、S)。

最简单的方法就是 select 您想要旋转的列,然后将其他所有内容转换为其他格式。

bird_data %>%
  pivot_longer(cols = paste(1:31),
               names_to = "day", 
               values_to = 'location') %>% 
  filter(location != "", 
         Name == "Taiwan")

我使用 paste() fx 将整数强制转换为字符。最后 filter 步骤只是 1. 删除 null/空行和 2. 显示 Taiwan.

的行

一旦您将其旋转更长的时间,您就可以弄清楚要如何处理 Freq 和其他列的多余行。在 pivot_longer().

cols 参数中删除其他列很容易