我有一个包含标识符和 Storm 类别的 Dataframe 。现在,类别在一列中,但我想为每个类别添加值为1或0的列。我不想将数据重新整形为宽的,因为在实际的数据集中有许多长格式变量需要保留。我目前使用的是一系列ifelse语句。但我觉得可能有更好的办法
library(dplyr)
library(tidyr)
df <- data.frame(
ID = c("A", "B", "C", "D", "A", "B", "C", "D", "A", "B", "C", "D"),
cat = c("TS", NA, NA, "TS", "1", "1", NA, NA, "2", NA, NA, NA)
)
df$cat_TS <- ifelse(df$cat == "TS", 1, 0) %>% replace_na(., 0)
df$cat_1 <- ifelse(df$cat == "1", 1, 0) %>% replace_na(., 0)
df$cat_2 <- ifelse(df$cat == "2", 1, 0) %>% replace_na(., 0)
2条答案
按热度按时间db2dz4w81#
我们可以使用
pivot_wider
-创建一个序列列'rn',然后使用pivot_wider
将values_fn
重新整形为宽,length
和values_fill
为0或使用
fastDummies
jtw3ybtb2#
用基R的一个想法
首先,获取所有唯一的类别名称
然后在列
cat
中查找cats
中每个条目的匹配项。另外,我将cat列保留在中以显示匹配正确。通过使用df$ID
而不是df
作为cbind
中的第一个参数来删除它。