Извлечение имен списка data.frames вместе со значениями в data.frame в R - PullRequest
2 голосов
/ 28 июня 2019

В приведенном ниже коде j является именованным списком data.frames. Мне было интересно, может ли быть способ:

(a) извлекает числовые значения переменных (т. Е. one.short и one.long) внутри фреймов данных и прикрепляет связанные с ними имена (т. Е. "AAA" или "BBB" или "CCC") к извлеченным значениям?

(b) если переменная (т. Е. one.short или one.long) имеет значение NA, то при извлечении этой переменной измените имя этого data.frame на NA?

Ожидаемый результат:

В приведенном ниже примере я ожидаю, что мой вывод будет выглядеть следующим образом:

one.short = list(c("AAA", .6), c(NA, NA), c("CCC", .4))

one.long = list(c("AAA", .8), c(NA, NA), c(NA, NA))

R Код и воспроизводимые данные:

j <- list(data.frame(one.short = .6, one.long = .8), data.frame(one.short = NA, 
one.long = NA), data.frame(one.short = .4, one.long = NA))

names(j) <- c("AAA", "BBB", "CCC")

# I tried this without success:
one.short = sapply(1:length(j), function(i) j[[i]]$one.short)
one.long  = sapply(1:length(j), function(i) j[[i]]$one.long)

Ответы [ 2 ]

2 голосов
/ 28 июня 2019

Мы можем использовать [[, чтобы сделать это без анонимной функции

v1 <- sapply(j, `[[`, 'one.short')
v1
#  AAA BBB CCC 
# 0.6  NA 0.4 

Если мы хотим установить имена значений, которые NA

names(v1)[is.na(v1)] <- "NULL"
v1
#   AAA NULL  CCC 
#  0.6   NA  0.4 

Обратите внимание, что NULL должно быть в list, потому что оно сбрасывается в vector

c('a', 'b', NULL)
#[1] "a" "b"   


list('a', 'b', NULL)
#[[1]]
#[1] "a"

#[[2]]
#[1] "b"

#[[3]]
#NULL
1 голос
/ 28 июня 2019

Вот базовая версия, все, что вам нужно, это промежуточное задание, чтобы оно заработало.

j_short <- sapply(names(j), function(x) j[[x]]$one.short)

j_short <- setNames(j_short, ifelse(is.na(j_short), NA, names(j_short)))

j_short
AAA BBB CCC 
0.6  NA 0.4 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...