【问题标题】:Replace custom values with NA用 NA 替换自定义值
【发布时间】:2020-02-08 02:47:32
【问题描述】:
df = data.frame("a" = c(1, 2, 3, "q", "r"),
                "b" = c(5,6,7,0,"s"))
dfWANT = data.frame("a" = c(1, 2, 3, "NA", "NA"),
                    "b" = c(5,6,7,0,"NA"))
REP = c("q", "r", "s")

df[,][df[,] == REP] <- NA

我的目标是指定一个列表 (REP),其中包含我想要设置为 NA 的分数。原始数据是df,我想要的是dfWANTREP 是我要设置为 NA 的值向量,最后一行是我的尝试,仅适用于 col a。

【问题讨论】:

  • 这个:df = as.data.frame(lapply(df, as.numeric))?
  • 或:df = as.data.frame(lapply(df, function(x) ifelse(x%in%REP, NA,x)), stringsAsFactors = F)
  • @R.Schifini 非常感谢,但我不想只删除我在 REP 中指定的所有特征/字符串。
  • 不是肯定的,但似乎这个问题应该主要由this one覆盖

标签: r dataframe missing-data


【解决方案1】:

您可以使用sapply 根据其中存在REP 值来获得TRUE/FALSE 值的逻辑矩阵。然后我们可以用NA 替换那些TRUE 值。

df[sapply(df, `%in%`, REP)] <- NA

#     a    b
#1    1    5
#2    2    6
#3    3    7
#4 <NA>    0
#5 <NA> <NA>

dplyr中,我们可以使用mutate_all

library(dplyr)
df %>% mutate_all(~replace(., . %in% REP, NA))

【讨论】:

    【解决方案2】:

    我们可以将data.frame 转换为matrix 并执行%in% 而不循环base R

    df[`dim<-`(as.matrix(df) %in% REP, dim(df))] <- NA
    df
    #     a    b
    #1    1    5
    #2    2    6
    #3    3    7
    #4 <NA>    0
    #5 <NA> <NA>
    

    或者使用高效的data.table

    library(data.table)
    setDT(df)
    for(j in seq_along(df)) set(df, i = which(df[[j]] %in% REP),  j=j, value = NA_character_)
    

    【讨论】:

      猜你喜欢
      • 2014-06-28
      • 2015-04-26
      • 2019-03-14
      • 1970-01-01
      • 2014-11-30
      • 2011-12-05
      相关资源
      最近更新 更多