【问题标题】:Replace column values conditional on another column being equal to a vector [duplicate]以另一列等于向量为条件替换列值[重复]
【发布时间】:2020-04-05 11:35:18
【问题描述】:

我有一个数据框:

> df <- data.frame(name=c('a','b','c', 'a'), value=c(1,1,1,1))

  digit value
1    1     1
2    2     1
3    3     1
4    1     1

还有另一个列表:

v <- c(1,3)

如果名称与列表 v 匹配,我想将 value 列中的值更改为 0,这样输出将是:

  digit value
1    1     0
2    2     1
3    3     0
4    1     0

【问题讨论】:

  • transform(df,value1 = value*(!name%in%name[v]))

标签: r replace conditional-statements


【解决方案1】:

我们可以使用%in% 创建逻辑向量,将“值”作为子集并将其分配给 0

df$value[df$digit %in% v] <- 0
df
#  name value
#1    1     0
#2    2     1
#3    3     0
#4    1     0

或者另一种选择是

df$value <-  df$value *(!df$digit %in% v)

或使用dplyr

library(dplyr)
df %>%
     mutate(value = replace(value, digit %in% v, 0))

或者data.table

library(data.table)
setDT(df)[name %chin% v, value := 0]

【讨论】:

    【解决方案2】:

    data.table,我们可以做

    library(data.table)
    setDT(df)[name %in% v, value := 0]
    df
    
    #   name value
    #1:    a     0
    #2:    b     1
    #3:    c     0
    #4:    a     0
    

    或者在基础 R 中使用 replace

    df$value <- replace(df$value, df$name %in% v, 0)
    

    【讨论】:

      猜你喜欢
      • 2019-04-20
      • 1970-01-01
      • 2021-09-23
      • 2020-01-17
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      • 2018-10-18
      • 1970-01-01
      相关资源
      最近更新 更多