Разделение data.frame внутри и снаружи функции R - PullRequest
1 голос
/ 10 октября 2019

У меня есть 3 data.frames ( A , B1 и B2 ). Я split каждая по переменной study.name и получаю желаемый результат , показанный как out1, out2, out3:

J <- split(A, A$study.name);      out1 <- do.call(rbind, c(J, make.row.names = F))
M <- split(B1, B1$study.name);    out2 <- do.call(rbind, c(M, make.row.names = F))
N <- split(B2, B2$study.name);    out3 <- do.call(rbind, c(N, make.row.names = F))

Но мне интересно, почемуЯ не могу добиться того же результата от моей функции foo? (см. ниже)

 A <- read.csv("https://raw.githubusercontent.com/izeh/m/master/irr.csv", h = T)  ## data A
B1 <- read.csv('https://raw.githubusercontent.com/izeh/m/master/irr2.csv', h = T) ## data B1
B2 <- read.csv("https://raw.githubusercontent.com/izeh/m/master/irr4.csv", h = T) ## data B2

 foo <- function(...){      ## The unsuccessful function `foo`

    r <- list(...)

 ## r <- Can we HERE delete rows and columns that are ALL `NA` or EMPTY in `r`?

    J <- unlist(lapply(seq_along(r), function(i) split(r[[i]], r[[i]]$study.name)), recursive = FALSE)

    lapply(seq_along(J), function(i)do.call(rbind, c(J[[i]], make.row.names = FALSE)) )
}

foo(B1, B2) # Example without success

1 Ответ

1 голос
/ 10 октября 2019

Мы можем выполнить очистку строк / столбцов перед выполнением split

foo <- function(...){  
    r <- list(...)

    lapply(r, function(dat) {

       m1 <- is.na(dat)|dat == ""
      i1 <- rowSums(m1) < ncol(m1)
      j1 <- colSums(m1) < nrow(m1)
      dat1 <- dat[i1, j1]
      facColumns <- sapply(dat1, is.factor)
      dat1[facColumns] <- lapply(dat1[facColumns], as.character)
      dat1$study.name <- factor(dat1$study.name, levels = unique(dat1$study.name))  
      l1 <- split(dat1, dat1$study.name)


          do.call(rbind, c(l1, make.row.names = FALSE))

     }

    )


}

lapply(foo(B1, B2), head, 2)
#[[1]]
#  study.name group.name outcome ESL prof scope type
#1 Shin.Ellis   ME.short       1   1    2     1    1
#2 Shin.Ellis    ME.long       1   1    2     1    1

#[[2]]
#  study.name group.name outcome ESL prof scope type
#1 Shin.Ellis   ME.short       1   1    2     1    1
#2 Shin.Ellis    ME.long       1   1    2     1    1

или использованием одного объекта в качестве аргумента

lapply(foo(A), head, 2)
#[[1]]
#  study.name group.name outcome ESL prof scope type ESL.1 prof.1 scope.1 type.1
#1 Shin.Ellis   ME.short       1   1    2     1    1     1      2       1      1
#2 Shin.Ellis    ME.long       1   1    2     1    1     1      2       1      1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...