我想知道"推荐""根据dplyr哲学将值分配给数据帧的子集的方法。这可能是一个例子最好的例子。假设我有一个数据框(名为df
):
V1 V2
a 1
b 2
c 3
我想在V2
为2
时将V1
的值更改为"a"
,并在1
为V1
时更改为"c"
{1}}。在R基础语言中,这通常由rownames
:
rownames(df) <- df$V1
df[c("a", "c"), ]$V2 <- c(2, 1)
经过一些搜索,我可以使用dplyr语言提出的最简洁的解决方案是
df <- df %>%
mutate(V2 = recode(V1, "a" = 2, "c" = 1) %>%
ifelse(V1 %in% c("a", "c"), ., V2))
但它感到笨拙。我错过了什么吗?使用dplyr更改数据框部分值的最佳方法是什么?
答案 0 :(得分:2)
我们可以使用case_when
。
df2 <- df %>%
mutate(V2 = case_when(
V1 %in% "a" ~ 2L,
V1 %in% "c" ~ 1L,
TRUE ~ V2
))
df2
# V1 V2
# 1 a 2
# 2 b 2
# 3 c 1
数据强>
df<- read.table(text = "V1 V2
a 1
b 2
c 3",
header = TRUE, stringsAsFactors = FALSE)