我想重塑我的数据,以便创建两个新列,条件是它们在第三列中的值。
我的数据现在看起来像这样:
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 也是如此),但我不知道如何编码。
通过添加
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