簡體   English   中英

如何通過“ apply”和“ lapply”操作保留姓氏?

[英]How can I preserve colnames through `apply` and `lapply` operations?

我有一個名為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))

任何幫助將是非常歡迎的:-)致敬Mads

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM