比较R中多个数据帧的内容

比较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

在这个场景中,我有多个数据帧(~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),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"