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

问题描述 投票:0回答:3

只是一个简单的问题:如果这些值存在于所有数据框的列中,如何将某些值替换为其他值?仅当指定了列时,像

 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],而我要替换的值不止一个。

提前感谢您的宝贵时间。

r dataframe replace
3个回答
2
投票

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)
}

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


2
投票

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

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
,每次我们都会从我们创建的子数据框中选择一个模式及其替换,并使用这些值执行一个
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 

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


0
投票

Base R
解决方案可能是:

矢量化开关:

foo <- Vectorize(FUN = function(x) {
                   switch(as.character(x),
                          "NULL" = 0,
                          "2" = 5,
                          NA)})

随后:

apply(df, 2, foo)

输出:

     a  b
[1,] 0 NA
[2,] 5  0
[3,] 0 NA
© www.soinside.com 2019 - 2024. All rights reserved.