我使用的数据集中,变量的缺失值由特定数字指定。我试图创建一个数据帧,用空格替换这些值,并创建另一个数据框,用NA替换它们。对于这个问题,我将关注数据帧,其中它们被NA取代。
对于变量,缺失值由数字8或9指定。我觉得我可以使用mutate_at((来更改所有这些,或者可能使用apply((函数,但我愿意接受任何建议。我试图编写的一般逻辑是:对于每个指定的列,如果值为8或9,则用空白替换,否则保持值不变。
数据集的结构使每列代表一个变量。我正试图从数据帧中选择变量的子集,因为只有少数列缺少值。我看过这个例子,但它并不能完全回答我的问题。
我知道我可以这样做,但这需要我指定数据帧中所有其他值的值——非缺失值。我更喜欢这样一种解决方案,即我可以指定8和9(缺失的值(会发生什么,并且可以在不列出它们的情况下保持其他值不变。
mutate_at(vars(card, lung, diabetes), function(x) case_when (x == 8 ~ "NA", x == 9 ~ "NA", x == 6 ~ 6, x == 4 ~ 4, x == 3 ~ 3, x == 2 ~ 2, x == 1 ~ 1))
这里,我们需要
library(dplyr)
df1 %>%
mutate_at(vars(card, lung, diabetes), ~ replace(., . %in% 8:9, NA))
# card lung diabetes val
#1 NA 1 1 1
#2 NA 3 4 2
#3 1 NA 3 3
#4 2 NA 5 4
#5 3 NA NA 5
或者,如果我们默认使用case_when
,则TRUE
为NA
,因此条件可以是
df1 %>%
mutate_at(vars(card, lung, diabetes), ~ case_when(! . %in% 8:9 ~ .))
# card lung diabetes val
#1 NA 1 1 1
#2 NA 3 4 2
#3 1 NA 3 3
#4 2 NA 5 4
#5 3 NA NA 5
或者另一个选项是na_if
df1 %>%
mutate_at(vars(card, lung, diabetes), ~ na_if(., 8) %>% na_if(.,9))
# card lung diabetes val
#1 NA 1 1 1
#2 NA 3 4 2
#3 1 NA 3 3
#4 2 NA 5 4
#5 3 NA NA 5
数据
df1 <- data.frame(card = c(8, 9, 1, 2, 3), lung = c(1, 3, 8, 9, 8),
diabetes = c(1, 4, 3, 5, 8), val = 1:5)
在基R:中
cols = c('card', 'lung', 'diabetes')
temp = df[, cols]
temp[temp == 8 | temp == 9] = NA
df[, cols] = temp
在一个简单的行中
apply(your.data.frame, 1, function(x){ifelse(x==8| x==9, NA,x)})
因此:
your.data.frame <- matrix(c(12,3,4,5,6,78,8,11,8,9, 2,45,65.6,6,7,8,9,12 ), ncol=3)
new.data.frame <- t(apply(your.data.frame, 1, function(x){ifelse(x==8| x==9, NA,x)}))
new.data.frame
[,1] [,2] [,3]
[1,] 12.0 3 4
[2,] 5.0 6 78
[3,] NA 11 NA
[4,] NA 2 45
[5,] 65.6 6 7
[6,] NA NA 12