R 将 ifelse 语句应用于 data.frame 的每个单元格
R applying an ifelse statement to every cell of a data.frame
我编辑了这个问题(希望按要求编辑)
我需要检查 data.frame 的每个单元格,如果它的值在特定范围内。我是新手,需要努力理解它。
我有 2 个 data.frame:
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。
谢谢!
尝试 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
)
我编辑了这个问题(希望按要求编辑)
我需要检查 data.frame 的每个单元格,如果它的值在特定范围内。我是新手,需要努力理解它。
我有 2 个 data.frame:
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。
谢谢!
尝试 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
)