R lapply: проверить, содержит ли фрейм данных столбец. Если нет, создайте этот столбец - PullRequest
0 голосов
/ 11 мая 2018

У меня есть список данных.

Я хотел бы проверить каждое имя столбца данных. Если имя столбца отсутствует, я хочу создать этот столбец в кадре данных и дополнить его значениями NA.

Фиктивные данные:

d1 <- data.frame(a=1:2, b=2:3, c=4:5)
d2 <- data.frame(a=1:2, b=2:3)

l<-list(d1, d2)

# Check the columns names of the dataframes 
# If column is missing, add new column, add NA as values 
lapply(l, function(x) if(!("c" %in% colnames(x))) 
             {
              c<-rep(NA, nrow(x))
              cbind(x, c) # does not work!
              })

Что я получаю:

[[1]]
NULL

[[2]]
  a b  c
1 1 2 NA
2 2 3 NA

Что я хочу вместо этого:

[[1]]
  a b c
1 1 2 4
2 2 3 5

[[2]]
  a b c
1 1 2 NA
2 2 3 NA

Спасибо за вашу помощь!

Ответы [ 4 ]

0 голосов
/ 11 мая 2018
library(purrr)

map(l, ~{if(!length(.x$c)) .x$c <- NA; .x})
0 голосов
/ 11 мая 2018

Вы можете использовать dplyr::mutate с ifelse:

library(dplyr)
lapply(l, function(x) mutate(x, c = ifelse("c" %in% names(x), c, NA)))

[[1]]
  a b c
1 1 2 4
2 2 3 4

[[2]]
  a b  c
1 1 2 NA
2 2 3 NA
0 голосов
/ 11 мая 2018

У вас есть несколько хороших ответов, но если вы хотите придерживаться базы R:

lapply(l, function(x) 
  if(!("c" %in% colnames(x))) {
  c<-rep(NA, nrow(x))
  return(cbind(x, c))
}
else(return(x))
)

Ваш код возвращал NULL для первого df, потому что у вас не было оператора else для обработки случая c, существующего (т.е. FALSE в операторе if).

0 голосов
/ 11 мая 2018

Один из способов - использовать dplyr::bind_rows, чтобы связать data.frame s в list и заполнить записи из пропущенных столбцов NA, а затем снова разделить полученный data.frame, чтобы получить list из data.frame s

df <- dplyr::bind_rows(l, .id = "id");
lapply(split(df, df$id), function(x) x[, -1])
#$`1`
#  a b c
#1 1 2 4
#2 2 3 5
#
#$`2`
#  a b  c
#3 1 2 NA
#4 2 3 NA

или аналогично tidyverse / magrittr цепочке

bind_rows(l, .id = "id") %>% split(., .$id) %>% lapply(function(x) x[, -1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...