比较R中多个数据帧的内容
在这个场景中,我有多个数据帧(~100,数字可能不同),但所有数据帧的大小都相同。它们基本上是指示器,我需要把它们全部取出来。请参阅以下代码:比较R中多个数据帧的内容,r,R,在这个场景中,我有多个数据帧(~100,数字可能不同),但所有数据帧的大小都相同。它们基本上是指示器,我需要把它们全部取出来。请参阅以下代码: df1 <- data.frame(col1=c("a","b","c","d"),col2=c(NA,NA,NA,NA),col3=c(NA,"X",NA,"X"),col4=c("X",NA,NA,"X")) df2 <- data.frame(col1=c("a","b","c","d"),col2=c("X","X",NA,NA),c
df1 <- data.frame(col1=c("a","b","c","d"),col2=c(NA,NA,NA,NA),col3=c(NA,"X",NA,"X"),col4=c("X",NA,NA,"X"))
df2 <- data.frame(col1=c("a","b","c","d"),col2=c("X","X",NA,NA),col3=c(NA,NA,NA,"X"),col4=c(NA,NA,NA,NA))
df3 <- data.frame(col1=c("a","b","c","d"),col2=c(NA,NA,"X",NA),col3=c(NA,NA,NA,NA),col4=c(NA,"X",NA,NA))
类似这样的东西
dfs <- list(df1, df2, df3)
index <- lapply(dfs, function(x) apply(x[,2:4], 1, function(y) all(is.na(y))))
output2 <- list()
for(i in 1:length(dfs)){
output2[[i]] <- dfs[[i]][!index[[i]],]
}
output <- do.call(rbind, output)
dfs假设我们从一个空df开始,我们将填充其中的列:
out <- data.frame(col1=c("a","b","c","d"), col2=NA, col3=NA, col4=NA)
out这是一种使用do.call
和pmax
# put your data.frames into a list
myList <- mget(ls(pattern="df\\d"))
在这里,myList[[1]][1]
从列表中的一个data.frames中提取第一列,以返回一个带有单列的data.frames。您可以等效地使用df[1]
lappy(myList,“==”,“X”)
运行data.frames列表,如果数据中包含一个单元格,则返回TRUE和FALSE值。然后do.call
使用pmax
返回真、假和NAs列表中每个单元格的最大值
如果有“X”而不是“1”是非常重要的,那么请遵循以下步骤
dat[dat == 1] <- "X"
dat[dat==1]谢谢。有没有一种方法可以提供数据帧列表,而不是在这行代码中显式列出它们:values!是的,在这里,df_list@scyth查看我的帖子以及我链接到的帖子,以获得一种更可扩展的方法,将data.frames放入列表中。如果dfs是包含我的数据帧名称的向量,那么我在运行索引行时出错:error in
[.default(x,2:4):维度数不正确
dfs是数据帧列表。您可以使用dfs加载它们
make_output_column <- function(cname){
sapply(1:nrow(out), function(r){
values <- c(df1[[cname]][r], df2[[cname]][r], df3[[cname]][r])
ifelse(sum(!is.na(values)) == 0, NA, "X")
})
}
cols <- c("col2", "col3", "col4")
out[, cols] <- lapply(cols, make_output_column)
## col1 col2 col3 col4
## a X <NA> X
## b X X X
## c X <NA> <NA>
## d <NA> X X
# put your data.frames into a list
myList <- mget(ls(pattern="df\\d"))
cbind(myList[[1]][1], do.call(function(...) pmax(..., na.rm=TRUE),
lapply(myList, "==", "X"))[, 2:4])
col1 col2 col3 col4
1 a 1 NA 1
2 b 1 1 1
3 c 1 NA NA
4 d NA 1 1
dat[dat == 1] <- "X"