Как я могу сохранить имена столбцов с помощью операций «apply» и «lapply»?

У меня есть data.frame с именем RawHM, и я хочу для каждой строки оценить наборы столбцов, определенных записями в списке AllList, чтобы увидеть, достаточно ли наблюдений, отличных от NA (не менее 2), чтобы сохранить набор столбцов записей для этой строки. Если нет, записи набора столбцов следует заменить на NA.

Весь список:

> dput(AllList)
structure(list(EGI = c("OO", "PP", "QQ"), Ref = c("RR", "SS", 
"TT")), .Names = c("EGI", "Ref"))

RawHM:

> dput(head(RawHM,10))
structure(list(OO = c(2.26128283268031, NA, NA, NA, 3.1189673217816, 
2.68131772865193, 1.50542478607416, NA, NA, NA), PP = c(NA, 2.86537733048028, 
2.02969026818987, NA, 2.54112005565494, 3.01623803266379, 1.73909499803785, 
2.49712237003491, NA, 1.67635525591635), QQ = c(NA, NA, 1.91968060122123, 
NA, NA, 2.63463138625395, NA, NA, NA, NA), RR = c(NA, NA, NA, 
NA, NA, 1.01488582084669, 1.01944283768403, NA, 1.06329113924051, 
NA), SS = c(0.950310559006211, 0.924124326404927, 1.07886334610473, 
0.951793999929161, 0.847931452310888, 0.879173290937997, 0.882126364182319, 
NA, NA, 0.713085668766746), TT = c(NA, NA, 1.09812749411644, 
NA, 0.9994646420402, 1.21090641120118, 1.25090285854196, NA, 
NA, NA)), .Names = c("OO", "PP", "QQ", "RR", "SS", "TT"), row.names = c(1L, 
2L, 15L, 16L, 23L, 24L, 25L, 30L, 36L, 40L), class = "data.frame")

Я попытался сделать функцию:

func<-function(x)unlist(lapply(AllList,function(y)if(length(na.omit(x[unlist(y)]))<2){rep(NA,length(unlist(y)))} else{x[unlist(y)]}))

А потом:

output<-t(apply(RawHM,1,func))

Что работает в принципе, но не сохраняет имена столбцов, которые я хочу, чтобы они были такими же, как в кадре данных RawHM. Я бы предпочел не переименовывать столбцы впоследствии.

> dput(head(output,10))
structure(c(NA, NA, NA, NA, 3.1189673217816, 2.68131772865193, 
1.50542478607416, NA, NA, NA, NA, NA, 2.02969026818987, NA, 2.54112005565494, 
3.01623803266379, 1.73909499803785, NA, NA, NA, NA, NA, 1.91968060122123, 
NA, NA, 2.63463138625395, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
1.01488582084669, 1.01944283768403, NA, NA, NA, NA, NA, 1.07886334610473, 
NA, 0.847931452310888, 0.879173290937997, 0.882126364182319, 
NA, NA, NA, NA, NA, 1.09812749411644, NA, 0.9994646420402, 1.21090641120118, 
1.25090285854196, NA, NA, NA), .Dim = c(10L, 6L), .Dimnames = list(
    c("1", "2", "15", "16", "23", "24", "25", "30", "36", "40"
    ), NULL))

Любая помощь будет очень кстати :-) С уважением Мэдс


person user2938867    schedule 09.12.2013    source источник


Ответы (1)


func — очень странная функция... даже прикольная!

Когда вы используете apply, ваши данные преобразуются в матрицу из data.frame. Ваша функция работает по-другому, если это data.frame, а не матрица:

func(RawHM[1,])
   EGI.OO    EGI.PP    EGI.QQ    Ref.RR    Ref.SS    Ref.TT 
2.2612828        NA        NA        NA 0.9503106        NA 
func(as.matrix(RawHM)[1,])
EGI1 EGI2 EGI3 Ref1 Ref2 Ref3 
  NA   NA   NA   NA   NA   NA 

Обратите внимание, что вы получаете разные результаты и разные имена!

В любом случае проблема с именами возникает из-за того, что при создании NA имен нет, поэтому результат дает противоречивый вывод для apply. Чтобы исправить это, вот модификация:

func2 <- function(x)unlist(lapply(AllList,function(y)if(length(na.omit(x[unlist(y)]))<2){sapply(y,function(z) NA)} else{x[unlist(y)]}))

t(apply(RawHM,1,func2))
     EGI.OO   EGI.PP   EGI.QQ   Ref.RR    Ref.SS    Ref.TT
1        NA       NA       NA       NA        NA        NA
2        NA       NA       NA       NA        NA        NA
15       NA 2.029690 1.919681       NA 1.0788633 1.0981275
16       NA       NA       NA       NA        NA        NA
23 3.118967 2.541120       NA       NA 0.8479315 0.9994646
24 2.681318 3.016238 2.634631 1.014886 0.8791733 1.2109064
25 1.505425 1.739095       NA 1.019443 0.8821264 1.2509029
30       NA       NA       NA       NA        NA        NA
36       NA       NA       NA       NA        NA        NA
40       NA       NA       NA       NA        NA        NA
person James    schedule 09.12.2013
comment
Привет, Джеймс... спасибо за ответ. Однако я бы предпочел решение, которое дало бы мне те же имена столбцов, что и в RawHM (т. е. OO, PP, QQ и т. д.), а не составное имя имени списка и имена членов списка... - person user2938867; 09.12.2013
comment
@ user2938867 Используйте names(allList)<-NULL - person James; 09.12.2013