R语言 根据列中包含的值创建和填充列

x33g5p2x  于 2023-09-27  发布在  其他
关注(0)|答案(1)|浏览(73)

我想重塑我的数据,这样我就创建了两个新列,条件是它们在第三列中的值。
我现在的数据看起来像这样:

Name       value
df_ox_val    1  
df_cat_val   2   
df_cat_val   1  
df_ox_val    4  
df_ox_val    5  
...

我想把它重塑成这样:

ox      cat  
         1  
2  
1  
         4  
         5  
...

我试过这个:

df %>%  
  mutate(ox = case_when("ox" %in% name ~ value),  
        (cat = case_when("cat" %in% name ~ value))

但这创建了两列NA值。
我也试过这个:

df %>%  
  pivot_wider(  
    id_cols = c("Name"),  
    values_from = value,  
    names_from = "Name"  
  )

但这为每个值创建了单独的列,而不是根据它们的“Name”是否包括ox或cat合并为两列。
基本上,当“Name”包含“ox”时,ox =“Name”(“cat”也是如此),但我不确定如何编码。

qvk1mo1f

qvk1mo1f1#

通过添加一个id列,您可以pivot_wider。您可能需要一个策略来处理NA s,它将填充结果 Dataframe 。由于这些列中的值是numeric,如果在您的工作环境中有意义,您可以将它们替换为0。如果不改变变量的类型,就不能用空值替换NA
首先,一些玩具数据

df <- data.frame(Name = sample(c('df_ox','df_cat'), 20, replace = TRUE),
                 value = sample(1:5, 20, replace = TRUE))

添加idpivot

library(dplyr)
library(tidyr)

df %>%
  mutate(id = row_number()) %>%
  pivot_wider(names_from = Name,
              values_from = value) 
#> # A tibble: 20 × 3
#>       id df_cat df_ox
#>    <int>  <int> <int>
#>  1     1      3    NA
#>  2     2     NA     1
#>  3     3     NA     3
#>  4     4     NA     3
#>  5     5     NA     1
#>  6     6      2    NA
#>  7     7      1    NA
#>  8     8      5    NA
#>  9     9      2    NA
#> 10    10     NA     2
#> 11    11      5    NA
#> 12    12     NA     2
#> 13    13     NA     5
#> 14    14     NA     5
#> 15    15      1    NA
#> 16    16     NA     5
#> 17    17      4    NA
#> 18    18      3    NA
#> 19    19      4    NA
#> 20    20      5    NA

创建于2023-09-25使用reprex v2.0.2

相关问题