根据列中包含的值创建并填充列

问题描述 投票:0回答:1

我想重塑我的数据,以便创建两个新列,条件是它们在第三列中的值。

我的数据现在看起来像这样:

Name   value
df_ox    1  
df_cat   2   
df_cat   1  
df_ox    4  
df_ox    5  
...  

我想把它重塑成这样:

df_ox  df_cat  
         1  
2  
1  
         4  
         5  
...   

我试过这个:

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

但这创建了两列充满 NA 值的列。

我也尝试过这个:

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

但这为每个值创建了单独的列,而不是根据它们的“名称”是否包含 ox 或 cat 合并为两列。

基本上,当“Name”包含“df_ox”时,df_ox =“Name”(对于 df_cat 也是如此),但我不知道如何编码。

r conditional-statements mutate
1个回答
0
投票

通过添加

id
列,您可以
pivot_wider
。您可能需要一种策略来处理将填充结果数据框的
NA
。由于这些列中的值是
numeric
,如果这在您的工作上下文中有意义,您可以将它们替换为 0。在不更改变量类型的情况下,您将无法将
NA
替换为空值。

首先,一些玩具数据

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

添加

id
pivot

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

© www.soinside.com 2019 - 2024. All rights reserved.