我有一个大型数据框,其中包含未知的列名和数字值1、2、3或4。
现在,我想用其列名替换所有4个值,并用一个空值替换所有1、2和3。

当然,我可以进行某种循环,如下所示:

df <- data.frame(id=1:8,unknownvarname1=c(1:4,1:4),unknownvarname2=c(4:1,4:1))
for (i in 2:length(df)){
  df[,i] <- as.character(df[,i])
  df[,i] <- mgsub::mgsub(df[,i],c(1,2,3,4),c("","","",names(df)[i]))
}

结果将是:
  id unknownvarname1 unknownvarname2
1  1                 unknownvarname2
2  2
3  3
4  4 unknownvarname1
5  5                 unknownvarname2
6  6
7  7
8  8 unknownvarname1 unknownvarname2

对于这样大小的数据帧,这根本没有问题。但是,当我在具有多达30k和多达40个未知变量的大型数据帧上尝试此循环时,该循环会花费一些时间才能完成。

有谁知道更快的方式做到这一点?我尝试了类似mutate()dplyr package之类的功能,但无法使其正常工作。

提前谢谢了!

最佳答案

一种使用基数R的方法

#Replace all the values with 1:3 with blank
df[-1][sapply(df[-1], `%in%`, 1:3)] <- ""
#Get the row/column indices where value is 4
mat <- which(df == 4, arr.ind = TRUE)
#Exclude values from first column
mat <- mat[mat[, 2] != 1, ]
#Replace remaining entries with it's corresponding column names
df[mat] <- names(df)[mat[, 2]]
df

#  id unknownvarname1 unknownvarname2
#1  1                 unknownvarname2
#2  2
#3  3
#4  4 unknownvarname1
#5  5                 unknownvarname2
#6  6
#7  7
#8  8 unknownvarname1

关于r - 如何用未知列名替换某些数据框值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58027378/

10-12 16:32
查看更多