R 如何通过'apply'和'lapply'操作保存colname?

R 如何通过'apply'和'lapply'操作保存colname?,r,dataframe,apply,names,lapply,R,Dataframe,Apply,Names,Lapply,我有一个名为RawHM的data.frame,希望为每一行计算由list AllList中的条目定义的列集,以便查看是否有足够的非NA观察值(不少于2个)来保留该行的列条目集。否则,列集合条目应替换为NA 所有列表: > dput(AllList) structure(list(EGI = c("OO", "PP", "QQ"), Ref = c("RR", "SS", "TT")), .Names = c("EGI", "Ref")) 罗姆: > dput(head(RawHM

我有一个名为RawHM的data.frame,希望为每一行计算由list AllList中的条目定义的列集,以便查看是否有足够的非NA观察值(不少于2个)来保留该行的列条目集。否则,列集合条目应替换为NA

所有列表:

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

> 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)]}))
欢迎任何帮助:-) 当做
Mads是一个非常奇怪的函数。。。甚至有点怪

使用
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 
请注意,您会得到不同的结果和不同的名称

在任何情况下,名称问题都源于这样一个事实:当您生成NAs时,没有名称,因此结果为
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

func2嗨,詹姆斯……谢谢你的回答。然而,我更喜欢一种解决方案,它能给我与RawHM中完全相同的colname(即OO、PP、QQ等),而不是列表名和列表成员名的复合名…@user2938867 Use
name(allList)
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 
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