我有一个大型数据框,其中包含未知的列名和数字值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/