2017-01-22 187 views
0

的每一个细胞我编辑了这个问题(希望的要求)[R施加ifelse语句将data.frame

我需要检查一个data.frame的每一个细胞,如果它的值在一定范围内。我很新的申请,需要努力了解它。

我有2个data.frames:

  • blood_df:158列,

  • stat_df:统计信息的blood_df

附每栏是用于解释一个小例子:

到目前为止我得到了这个,但它计算每个细胞的结果相同。

c0 <- c(0,0,0,0) 
c1 <- c(1,2,3,4) 
c2 <- c(5,6,7,8) 
c3 <- c(9,10,11,12) 
c4 <- c(13,14,15,16) 

blood_df <- data.frame(c0,c1,c2,c3,c4) 
stat_df <- data.frame(matrix(ncol = 5, nrow = 6)) 
colnames(stat_df) <- colnames(blood_df) 
rownames(stat_df) <- c("Mean","3*sd","sum", "Mean2","-3*sd","sum2") 

stat_df[1,2:5] <-apply(blood_df[,2:5], 2, mean, na.rm = TRUE) 
stat_df[2,2:5] <-apply(blood_df[1:4,2:5], 2, function(x) 3*sd(x,na.rm=TRUE)) 
stat_df[3,] <-colSums(stat_df[1:2,]) 
stat_df[4,2:5] <-apply(blood_df[,2:5], 2, mean, na.rm = TRUE) 
stat_df[5,2:5] <-apply(blood_df[1:4,2:5], 2, function(x) -3*sd(x,na.rm=TRUE)) 
stat_df[6,] <-colSums(stat_df[4:5,]) 

blood_df: 
## c0 c1 c2 c3 c4 
## 1 0 1 5 9 13 
## 2 0 2 6 10 14 
## 3 0 3 7 11 15 
## 4 0 4 8 12 16 

stat_df: 
##  c0  c1  c2  c3  c4 
## Mean NA 2.500000 6.500000 10.500000 14.500000 
## 3*sd NA 3.872983 3.872983 3.872983 3.872983 
## sum NA 6.372983 10.372983 14.372983 18.372983 
## Mean2 NA 2.500000 6.500000 10.500000 14.500000 
## -3*sd NA -3.872983 -3.872983 -3.872983 -3.872983 
## sum2 NA -1.372983 2.627017 6.627017 10.627017 

不工作,因为我需要它的部分:

blood_df[1:4,2:5] <- apply(blood_df[,2:5],2, function(x) 
        (ifelse((x > (stat_df[3,2:5]))|| 
        (x < (stat_df[6,2:5])), NA, x))) 

到目前为止,它给了我:

blood_df: 
## c0 c1 c2 c3 c4 
## 1 0 1 1 1 1 
## 2 0 5 5 5 5 
## 3 0 NA NA NA NA 
## 4 0 NA NA NA NA 

我希望得到的是:(检查如果每个值在一定范围之间)

blood_df: 
## c0 c1 c2 c3 c4 
## 1 0 1 5 9 13 
## 2 0 2 6 10 14 
## 3 0 3 7 11 15 
## 4 0 4 8 12 16 

如果它不在该范围内,该值应该更改为NA。

谢谢!

+1

能否请您为我们提供了一个可重复的例子?这将使回答问题更容易。 :) –

+1

并请添加所需输出的示例。 – ekstroem

+2

[关于如何给出一个可重现的例子的信息](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610) – Jaap

回答

1

尝试mapply

column_range = 2:5 
blood_df[, column_range] = mapply(function(blood, stat){ 
     ifelse((blood > stat[3]) | (blood < stat[6]), NA, blood) 
    }, 
    blood_df[, column_range], 
    stat_df[, column_range], 
    SIMPLIFY = FALSE 
) 
+0

其实你可能想'SIMPLIFY' arg为“TRUE”(缺省值)以绑定回数据帧列。本身就相当于'Map()'并返回一个向量列表。 – Parfait

+2

@Parfait结果列表将被映射到原始列。可重复的例子:'iris [,1:4] = lapply(iris [,1:4],scale)'。我认为它比通过矩阵和绑定回data.frame的对话更健壮,更快捷。 –