2016-10-13 22 views
1

我是R新手,但在這裏我有一個多個條件的多個度量的數據框,我想在相同條件的列上執行嵌套循環,測試它們是否有至少要有兩個真實的測量值(不是零),如果是的話,計算新數據集中這些特定條件的平均值。迭代列名稱的一個子集

> sample <- list(c(8,0,12,5,0,11), c(15,5,0,10,12,13), c(1,1,0,3,0,9), 
     c(11,9,8,0,4,7), c(12,5,5,0,9,0), c(1,7,2,0,8,0)) 
    > sample <- as.data.frame(sample) 
    > colnames(sample) <- c("x.1","x.2","x.3","y.1","y.2","y.3") 


    > sample 
    x.1 x.2 x.3 y.1 y.2 y.3 
1 8 15 1 11 12 1 
2 0 5 1 9 5 7 
3 12 0 0 8 5 2 
4 5 10 3 0 0 0 
5 0 12 0 4 9 8 
6 11 13 9 7 0 0 

我的輸出數據集最好應該是這樣的:

> Newsample 
    x y 
1 8 8 
2 2 7 
3 0 5 
4 6 0 
5 0 7 
6 11 0 

回答

2

我們定義f_rowmean功能:

f_rowmean <- function(y) apply(y,1, function(x) ifelse(sum(x!=0)>=2, mean(x), 0)) 

然後:

data.frame(x=f_rowmean(sample[,grep("x", names(sample))]), 
      y=f_rowmean(sample[,grep("y", names(sample))])) 

    # x y 
# 1 8 8 
# 2 2 7 
# 3 0 5 
# 4 6 0 
# 5 0 7 
# 6 11 0 

編輯

至於OP的新問題陳述(在評論),假設你的數據集是在df1,那麼你可以做:

res.cols <- c("CAOV-3 Reg", "CAOV-3 Mod", "OVCAR-3Reg", "OVCAR-4Reg", "VOA1056Reg", 
"VOA4698Reg", "VOA4698Mod", "TOV112DReg", "TOV112DMod", "TOV21G Mod", 
"HCC38 Reg", "HCC38 Mod") 

res <- setNames(data.frame(matrix(0,nrow(df1),length(res.cols))), res.cols) 
res <- sapply(res.cols, function(x) res[,x] <- f_rowmean(df1[,grep(x, names(df1))])) 
+0

對不起,我沒有清楚,但是我的數據集比上面這個虛擬示例大得多。它實際上由38個重複測量列組成,測量13個條件,所以我想在整個數據幀中創建一個循環來創建一個新的數據幀,而不僅僅是x和y列表 – Mohere

+0

列名是: 「CAOV-3 Reg.3「」CAOV-3 Reg.2「」CAOV-3 Reg.3「」CAOV-3 Mod.1「」CAOV-3 Mod.2「」CAOV-3 Mod.3「」OVCAR-3Reg。 1「」OVCAR-3Reg.2「」OVCAR-3Reg.3「」OVCAR-4Reg.1「」OVCAR-4Reg.2「」OVCAR-4Reg.3「 」VOA1056Reg.1「」VOA1056Reg.2「」VOA1056Reg 「VOA4698Reg.1」「VOA4698Reg.2」「VOA4698Reg.3」 「VOA4698Mod.1」「VOA4698Mod.2」「VOA4698Mod.3」 「TOV112DMod.1」「TOV112DMod.2」「TOV112DMod.3」 「TOV21G Reg.1」「TOV21G Reg.2」「TOV21G Reg.3」 「TOV21G Mod.1」「TOV21G Mod.2」「TOV21G Mod.3」「HCC38 Reg.1」「HCC38 Reg.2」「 HCC38 Mod.1「」HCC38 Mod.2「」HCC38 Mod.3「 – Mohere

+0

並且id我想創建一個數據幀: – Mohere

0

我們通過「X」和「Y」列在list指數環,獲得邏輯矩陣的rowSums和使用ifelse拿到rowMeans

data.frame(setNames(lapply(list(grep("^x", names(sample)), 
          grep("^y", names(sample))), function(i) { 
         x1 <- sample[i] 
       ifelse(rowSums(x1!=0)>1, rowMeans(x1), 0)}), c("x", "y"))) 
# x y 
#1 8 8 
#2 2 7 
#3 0 5 
#4 6 0 
#5 0 7 
#6 11 0 
+0

對不起,我沒有清楚這一點,但我的數據集比上面這個虛擬示例大得多。它實際上由38個重複測量列組成,測量13個條件,所以我想在整個數據框中創建一個循環來創建一個新的數據框,而不僅僅是x和y列表 – Mohere

+0

@Mohere很容易改變這個 – akrun