【问题标题】:How can I preserve colnames through `apply` and `lapply` operations?如何通过 `apply` 和 `lapply` 操作保留 colnames?
【发布时间】:2013-12-09 15:25:28
【问题描述】:

我有一个名为 RawHM 的 data.frame,并且希望对每一行评估由列表 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))

非常欢迎任何帮助:-) 问候 疯子

【问题讨论】:

    标签: r dataframe apply names lapply


    【解决方案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
    

    【讨论】:

    • 嗨詹姆斯...谢谢你的回答。但是,我更喜欢一个解决方案,它给我与 RawHM 完全相同的列名(即 OO、PP、QQ 等),而不是列表名称和列表成员名称的复合名称......
    • @user2938867 使用names(allList)&lt;-NULL
    猜你喜欢
    • 2016-11-12
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 2014-10-27
    • 1970-01-01
    相关资源
    最近更新 更多