如何替换 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
我希望这是清楚的。如果您有任何疑问,请告诉我
一个简单的问题:如果数据框的所有列中都存在这些值,我如何用其他值替换这些值? 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
我希望这是清楚的。如果您有任何疑问,请告诉我