r - 根据条件更改分组中的值

标签 r dataframe dplyr

我从以下数据开始:

df <- data.frame(Person=c("Ada","Ada","Bob","Bob","Carl","Carl"), Day=c(1,2,2,1,1,2), Fruit=c("Apple","X","Apple","X","X","Orange"))

  Person Day  Fruit
1    Ada   1  Apple
2    Ada   2      X
3    Bob   2  Apple
4    Bob   1      X
5   Carl   1      X
6   Carl   2 Orange

我想遍历每个人并替换未知的水果 XAppleOrange同时确保如果它是 Orange有一天,它应该是Apple第二天,反之亦然。

对于艾达:Day 1 = Apple , 意思是 Day 2 = X <- Orange

我不知道从哪里开始,除了:

library(dplyr)
df %>%
      group_by(Person)
  • 对方向有什么建议吗?

最佳答案

另一种使用 dplyr 中的 case_when 的解决方案:

library(dplyr)

# Changing datatypes to character instead of factor
df[] <- lapply(df, as.character)

# Optional, but this line will convert all columns to appropriate datatype, eg. Day will be integer
df <- readr::type_convert(df)

df %>%
  group_by(Person) %>%
  mutate(
    Contains_Apple = any(Fruit == "Apple"),
    Contains_Orange = any(Fruit == "Orange"),
    Fruit = case_when(
      Fruit == "X" & Contains_Apple == F ~ "Apple",
      Fruit == "X" & Contains_Orange == F ~ "Orange",
      TRUE ~ Fruit
    )
  )

# A tibble: 6 x 5
# Groups: Person [3]
  Person   Day Fruit  Contains_Apple Contains_Orange
  <chr>  <int> <chr>  <lgl>          <lgl>          
1 Ada        1 Apple  T              F              
2 Ada        2 Orange T              F              
3 Bob        2 Apple  T              F              
4 Bob        1 Orange T              F              
5 Carl       1 Apple  F              T              
6 Carl       2 Orange F              T    

通过以下方式删除 Contains_AppleContains_Orange:

df %>% 
  group_by(Person) %>% 
  mutate(Contains_Apple = any(Fruit == "Apple"),
         Contains_Orange = any(Fruit == "Orange"),
         Fruit = case_when(Fruit == "X" & Contains_Apple == F ~ "Apple",
                           Fruit == "X" & Contains_Orange == F ~ "Orange",
                           TRUE ~ Fruit)) %>% 
  select(Person, Day, Fruit) %>% 
  ungroup()

# A tibble: 6 x 3
  Person   Day Fruit 
  <chr>  <int> <chr> 
1 Ada        1 Apple 
2 Ada        2 Orange
3 Bob        2 Apple 
4 Bob        1 Orange
5 Carl       1 Apple 
6 Carl       2 Orange

关于r - 根据条件更改分组中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48244022/

相关文章:

r - 按时间间隔聚合一个数据帧来自另一个数据帧

r - 带有 Y 轴中断和误差条的条形图

r - 如何指定 by( ) 或相关的 apply( ) 函数中使用的 FUN

python - 基于另一列的字符串搜索,使用 Spark Dataframe 中的函数创建新列

r - 我可以使用 mutate() 和 across() 根据许多其他列来改变许多列吗?

r - match() 与 %in% 运算符

r - 在 R 中执行此操作的更好方法

r - 使用另一个变量的公式为数据框创建新列

r - 从数据框中提取与向量匹配的行,但匹配必须始终位于值中字符串的末尾

r - 查找多列具有相同值的行