如何替换 r 中所有列中的值

How to replace values in all columns in r

一个简单的问题:如果数据框的所有列中都存在这些值,我如何用其他值替换这些值? mapvalues recode 之类的函数只有在指定了列时才有效,但在我的例子中,数据框有 89 列,所以这会很耗时。

为清楚起见,请考虑以下示例。我想用另一个值替换 [NULL]。

示例:

a <- c("NULL",2,"NULL")
b <- c(3, "NULL", 1)

df <- data.frame(a, b)
df

           a         b
0      NULL          3
1          2      NULL 
2      NULL          1

例子和我的例子不同的是数据集是[35383 x 89],我要替换的值不止一个

提前感谢您的宝贵时间。

Ronak Shah 评论的扩展。如果您愿意,可以添加 0。或者,如果您愿意,可以将其替换为所需的值。

例如,将 NULL 替换为相应列的平均值:

#Run a loop to convert the characters into numbers because for your case it is all characters
#This will change the NULL to NAs.

for (i in colnames(df)){
  df[,i] <- as.numeric(df[,i])
}

#Now replace the NAs with the mean of the column

for (i in colnames(df)){
  df[,i][is.na(df[,i])] <- mean(df[,i], na.rm=TRUE)
}

您也可以类似地对中位数执行此操作。如果您有任何疑问,请在评论中告诉我。

对于初学者,我在您的示例中添加了更多行以更好地展示代码的工作原理

df

#     a    b
#1  NULL    3
#2     2 NULL
#3  NULL    1
#4     a   14
#5     1    a
#6    14    5

首先,创建两个向量:一个包含要替换的值(模式),另一个包含以相同顺序替换的值。为确保您做对了,将它们放在一个数据框中并查看行(这也有助于下一步)

在这种情况下,我希望NULL为0,“a”为“alpha”,依此类推,如下所示

pattern <- c("NULL", "a", 14, 1)
replacement <- c(0, "alpha", "fourteen", "one")
subs <- data.frame(pattern, replacement)
subs

#  pattern replacement
#1    NULL           0
#2       a       alpha
#3      14    fourteen
#4       1         one

为了完成它,我们将创建一个 for 每次我们都会从我们创建的 subs 数据框中选择一个模式及其替换,并使用这些值执行 map_df()。此函数迭代原始数据框 (df) 中的列,并将 gsub() 函数与模式和替换

一起应用
for (i in 1:nrow(subs)) {
  df <- map_df(df, gsub, pattern = subs$pattern[i], replacement = subs$replacement[i])
}

df

#   a        b        
#1  0        3       
#2  2        0       
#3  0        one     
#4  alpha    fourteen
#5  one      alpha   
#6  fourteen 5 

我希望这是清楚的。如果您有任何疑问,请告诉我