使用dplyr根据变量进行子集,重新排序和分配

时间:2017-11-22 16:38:22

标签: r dataframe dplyr

我想知道"推荐""根据dplyr哲学将值分配给数据帧的子集的方法。这可能是一个例子最好的例子。假设我有一个数据框(名为df):

V1 V2
 a  1
 b  2
 c  3

我想在V22时将V1的值更改为"a",并在1V1时更改为"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更改数据框部分值的最佳方法是什么?

1 个答案:

答案 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)