我正在處理一個數據集,其中源名稱由變量前面的2個字母縮寫指定。所以來自源AA的所有變量都以AA_var1
開頭,而源bb有bb_variable_name_2
。實際上有很多來源和大量的變量名,但是我只留下了2個作爲最小的例子。rowMean如果行通過測試
我想創建一個平均值的變量,其中源的數量,也就是說,該行上的數據不是NA的唯一前綴的數量大於1的任何行。如果只有一個源,我想這個總變量是NA。
因此,舉例來說,我的數據是這樣的:
> head(df)
AA_var1 AA_var2 myid bb_meow bb_A_v1
1 NA NA 123456 10 12
2 NA 10 194200 12 NA
3 12 10 132200 NA NA
4 12 NA 132201 NA 12
5 NA NA 132202 NA NA
6 12 13 132203 14 NA
而且我想以下幾點:
> head(df)
AA_var1 AA_var2 myid bb_meow bb_A_v1 rowMeanIfDiverseData
1 NA NA 123456 10 12 NA #has only bb
2 NA 10 194200 12 NA 11 #has AA and bb
3 12 10 132200 NA NA NA #has only AA
4 12 NA 132201 NA 12 12 #has AA and bb
5 NA NA 132202 NA NA NA #has neither
6 12 13 132203 14 NA 13 #has AA and bb
通常情況下,我只是用rowMeans()
對於這種事情。但是,只選擇變量名遵循約定/行級/的行的額外子集使我感到困惑於項目級和我習慣的通用應用級聲明。
我可以在數據幀級別的前綴:
mynames <- names(df[!names(df) %in% c("myid")])
tmp <- str_extract(mynames, perl("[A-Za-z]{2}(?=_)"))
uniq <- unique(tmp[!is.na(tmp)])
所以,
> uniq
[1] "AA" "bb"
所以,我可以把這個功能我可以申請的df,像這樣:
multiSource <- function(x){
nm = names(x[!names(x) %in% badnames]) # exclude c("myid")
tmp <- str_extract(nm, perl("[A-Za-z]{2}(?=_)")) # get prefixes
uniq <- unique(tmp[!is.na(tmp)]) # ensure unique and not NA
if (length(uniq) > 1){
return(T)
} else {
return(F)
}
}
但是,這是顯而易見的困惑,並仍然獲得數據集級別,即:
> lapply(df,multiSource)
$AA_var1
[1] FALSE
$AA_var2
[1] FALSE
$bb_meow
[1] FALSE
$bb_A_v1
[1] FALSE
而且......
> apply(df,MARGIN=1,FUN=multiSource)
給出適用於所有。
我,否則要被說...
df$rowMean <- rowMeans(df, na.rm=T)
# so, in this case
rowMeansIfTest <- function(X,test) {
# is this row muliSource True?
# if yes, return(rowMeans(X))
# else return(NA)
}
df$rowMeanIfDiverseData <- rowMeansIfTest(df, test=multiSource)
但我不清楚如何做到這一點沒有某種形式的for循環。
一些與你的第一個兩張桌子不好。目前尚不清楚(對我而言)如何獲得這些手段。爲什麼有些值從第一個表格變爲第二個表格(BB_var3)?你介意分解你的計算嗎?我認爲它比你想象的要簡單得多。 –
對不起,第3行有錯誤。它應該沒有BB源,只有AA源,所以它應該失敗了multiSource測試,rowMean應該返回NA – Mittenchops