只是一个简单的问题:如果这些值存在于所有数据框的列中,如何将某些值替换为其他值?仅当指定了列时,像
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
,每次我们都会从我们创建的子数据框中选择一个模式及其替换,并使用这些值执行一个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
我希望这是清楚的。如果您有任何疑问请告诉我
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