【问题标题】:Changing column values for each unique value based on a condition根据条件更改每个唯一值的列值
【发布时间】:2020-02-12 16:49:34
【问题描述】:

我有一个数据集,我需要根据条件更改其中一列的值。

columna columnb 
Y123    B
Y123    A
Y123    T
Y124    B
Y124    A
Y124    T
Y125    A
Y126    A

我正在尝试编写一个 for 循环(或更简单)来迭代 columna,并且对于每个唯一值,如果 B 和 T 不存在,例如值 Y125 和 Y126,则将 A 替换为 T

for(ii in 1:length(unique(data$columna)){
  if (data$columnb != "B" & data$columnb != "T"){
    marketf$columnb = "T"
  }
}

我想这看起来完全错误,但我尝试了很多东西,包括 for each 和 other 循环,但没有真正奏效。

【问题讨论】:

  • 你能显示预期的输出吗
  • 如果 B、A、T 都不存在,怎么能用 T 代替 A?
  • 道歉。如果 B 和 T 不存在,将 A 替换为 T

标签: r for-loop foreach


【解决方案1】:

按'columna'分组后,我们可以replace'columnb'值,其中不同元素的数量小于3并且等于'A'到'T'

library(dplyr)
df1 %>% 
   group_by(columna) %>%
   mutate(columnb = replace(columnb, n_distinct(columnb) <3 & 
                              columnb =='A', 'T'))
# A tibble: 8 x 2
# Groups:   columna [4]
#  columna columnb
#  <chr>   <chr>  
#1 Y123    B      
#2 Y123    A      
#3 Y123    T      
#4 Y124    B      
#5 Y124    A      
#6 Y124    T      
#7 Y125    T      
#8 Y126    T      

如果我们专门寻找“B”和“T”

df1 %>%
    group_by(columna) %>%
    mutate(columnb = replace(columnb, !any(c('B', 'T') %in% columnb)
           & columnb == 'A',  'T'))
# A tibble: 8 x 2
# Groups:   columna [4]
#  columna columnb
#  <chr>   <chr>  
#1 Y123    B      
#2 Y123    A      
#3 Y123    T      
#4 Y124    B      
#5 Y124    A      
#6 Y124    T      
#7 Y125    T      
#8 Y126    T    

数据

df1 <- structure(list(columna = c("Y123", "Y123", "Y123", "Y124", "Y124", 
"Y124", "Y125", "Y126"), columnb = c("B", "A", "T", "B", "A", 
"T", "A", "A")), class = "data.frame", row.names = c(NA, -8L))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 2022-01-25
    • 2020-08-20
    • 1970-01-01
    • 2013-12-27
    相关资源
    最近更新 更多