2016-11-24 90 views
1

我有像這樣的數據:替換非零的列平均多個列中的值

aye <- c(0,0,3,4,5,6) 
bee <- c(3,4,0,0,7,8) 
see <- c(9,8,3,5,0,0) 
df <- data.frame(aye, bee, see) 

我正在尋找一種簡潔的方式來創建基於平均每個數據幀中的列列,其中零保持在零。

爲了獲得不包括零均值:

df2 <- as.data.frame(t(apply(df, 2, function(x) mean(x[x>0])))) 

我無法弄清楚如何簡單地用平均不包括零替換列中的值。我的做法迄今:

df$aye <- ifelse(df$aye == 0, 0, df2$aye) 
df$bee <- ifelse(df$bee == 0, 0, df2$bee) 
df$see <- ifelse(df$see == 0, 0, df2$see) 

但是,這就會變得混亂諸多變數 - 將是不錯的包裹起來的一個功能。

感謝您的幫助!

回答

2

爲什麼我們不能只使用

data.frame(lapply(dat, function (u) ave(u, u > 0, FUN = mean))) 

# aye bee see 
#1 0.0 5.5 6.25 
#2 0.0 5.5 6.25 
#3 4.5 0.0 6.25 
#4 4.5 0.0 6.25 
#5 4.5 5.5 0.00 
#6 4.5 5.5 0.00 

請注意,我用dat而不是df作爲數據幀的名稱。 df是R中的一個函數,並不掩蓋它。

+0

簡明扼要。保持偉大的工作! – akrun

+0

或者另一個選項是'lapply(df,function(u)(!! u)* mean(u [u> 0]))' – akrun

+0

是的,這是一個雙重否定,第一個否定給出0值TRUE,所以再次取消使其成爲假,但我想你的版本好多了 – akrun

1

我們可以在x中將應用函數的結果保留爲數值向量。

x <- apply(df, 2, function(x){ mean(x[x>0])}) 
df[which(df!=0, arr.ind = T)] <- x[ceiling(which(df!=0)/nrow(df))] 

df 
# aye bee see 
#1 0.0 5.5 6.25 
#2 0.0 5.5 6.25 
#3 4.5 0.0 6.25 
#4 4.5 0.0 6.25 
#5 4.5 5.5 0.00 
#6 4.5 5.5 0.00 

破譯密碼向下進一步解釋工作

給人的指數,其中值不爲零

which(df! = 0) 
#[1] 3 4 5 6 7 8 11 12 13 14 15 16 

該行決定,我們打算從x

選擇哪個指數
ceiling(which(df!=0)/nrow(df)) 
#[1] 1 1 1 1 2 2 2 2 3 3 3 3 

x[ceiling(which(df!=0)/nrow(df))] 
#aye aye aye aye bee bee bee bee see see see see 
#4.50 4.50 4.50 4.50 5.50 5.50 5.50 5.50 6.25 6.25 6.25 6.25 

現在將上述值替換爲值i sn't在數據幀等於0

df[which(df!=0, arr.ind = T)] <- x[ceiling(which(df!=0)/nrow(df))] 
1

嘗試重新安排你已經擁有成zeroless_mean功能,然後在你的data.frame中的每一列使用apply

# Data 
aye <- c(0,0,3,4,5,6) 
bee <- c(3,4,0,0,7,8) 
see <- c(9,8,3,5,0,0) 
dff <- data.frame(aye, bee, see) 

# Function 
zeroless_mean <- function(x) ifelse(x==0,0,mean(x[x!=0])) 

# apply 
data.frame(apply(dff, 2, zeroless_mean)) 

# Output 

    aye bee see 
1 0.0 5.5 6.25 
2 0.0 5.5 6.25 
3 4.5 0.0 6.25 
4 4.5 0.0 6.25 
5 4.5 5.5 0.00 
6 4.5 5.5 0.00 

我希望這幫助。