我想在R中对具有相同名称但来自多个数据帧的不同长度的列进行一些统计分析。我创建了一个列表:
my.list <- list(df1, df2, df3, df4)
现在,由于感兴趣的列(例如:my.col)的某些元素包含单词“FAILED”而不是数字,我将其替换为“NA”:
for (i in 1:length(my.list)){
for (j in 1:length(my.list[[i]]$my.col)){
if (my.list[[i]]$my.col[j] %in% c("FAILED"))
{my.list[[i]]$my.col[j] <- 'NA'};
}
}
我很确定这不是问题的最佳解决方案,但至少它有效。虽然我不得不说它会引起警告,但在另一列(不是my.col)中,有无效的因子水平被'NA'取代。不知道为什么它实际上考虑其他列而不是my.col。我们非常感谢您提出的改进建议。
现在,剩余的数字包含小数逗号而不是点。虽然我在使用“dec =”,“”导入.csv文件时尝试消除此问题,但这对于包含除数字之外的任何内容的列(例如“FAILED”)不起作用。所以我必须用点替换逗号,这对我来说不起作用。我试过了:
for (i in 1:length(my.list)){
as.numeric(gsub(",", ".", my.list[[i]]$my.col))
}
这不会产生任何错误,但它也不会改变任何错误,但如果我输入例如
as.numeric(gsub(",", ".", my.list[[4]]$my.col))
它为列表的第4个元素做了我想要做的事情。从我的观点来看,两者都应该是一样的。这有什么问题?
顺便说一句,我不想从数据框中删除其他列,因为将来可能需要它们用于其他分析。
答案 0 :(得分:1)
您可以使用plyr包有效地完成此操作。
请注意,在示例中,我使用内置的iris数据。 而不是替换&#34; FAILED&#34;使用NA,我替换了&#34; versicolor&#34;的值。 我没有用句号替换昏迷,而是用w替换了s。
my.list <- list(iris, iris)
library(plyr)
my.list<-llply(.data=my.list,
function(x) { x$Species<-as.character(x$Species)
x$Species[x$Species=="versicolor"]<-"NA"
x$Species<-gsub(pattern="s",
replacement="w",
x=x$Species)
x$Species<-as.factor(x$Species)
return(x)
})
as.character被添加为一种方法的示例,用于规避向一个因子添加级别的问题。 as.factor确保该列作为新级别的因子返回。
这也使您可以灵活地从列表转换为data.frame。只需用ldply替换llply。