簡體   English   中英

如果在 dataframe 和 R 中缺失,則創建列(tidyverse)

[英]Create columns if missing in dataframe with R (tidyverse)

我有一個具有這種結構的 df

id 1 2 3 5 
1  1 0 2 0
2  3 4 1 0
3  1 1 0 2

我想要的是完成它,因為我需要它符合從 1 到 6 列的格式,所以預期的結果是

id 1 2 3 4 5 6 
1  1 0 2 0 0 0
2  3 4 1 0 0 0
3  1 1 0 0 2 0

這是一個“缺失”列的示例,在此示例中,它是 4 和 6,所以我們的想法是,如果該列缺失,它將被創建並用零填充。

謝謝!

執行此操作的一種方法是重塑 long,使用tidyr::complete獲取列名的范圍,然后重塑 wide。 由於新列的id未知,因此我也刪除了 id = NA 行。

請注意,R 並不總是與數字列名稱配合得很好,並且它們不被視為句法。 https://stat.ethz.ch/R-manual/R-devel/library/base/html/make.names.html

語法上有效的名稱由字母、數字和點或下划線字符組成,並以字母或點開頭,后面不跟數字。

但是如果我們告訴 R 不要檢查,我們可以用數字字符串作為列名來創建 dataframe:

library(tidyverse)
data.frame(                 
  check.names = FALSE,          
           id = c(1L, 2L, 3L),
          `1` = c(1L, 3L, 1L),
          `2` = c(0L, 4L, 1L),
          `3` = c(2L, 1L, 0L),
          `5` = c(0L, 0L, 2L)
) %>% 
  pivot_longer(-id, names_transform = as.numeric) %>%
  complete(name = 1:6) %>%
  pivot_wider(names_from = name, values_from = value, values_fill = 0) %>%
  drop_na(id)

結果

# A tibble: 3 × 7
     id   `1`   `2`   `3`   `4`   `5`   `6`
  <int> <int> <int> <int> <int> <int> <int>
1     1     1     0     2     0     0     0
2     2     3     4     1     0     0     0
3     3     1     1     0     0     2     0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM