用于将一列中的值替换为另一列中的缺失值的R代码

时间:2015-05-05 22:22:23

标签: r if-statement na

我有一个名为one的数据集,其中有四列:D1D2D3D4D1是id。 D2有七个级别(abcdefg )。 D3缺少数据,我希望通过匹配列D2D4中的条件来填充这些数据。我正在从列D4的四个级别(acde)对应的列D2中选择值,然后替换列D3的缺失值来自D4

D1  D2  D3  D4
1   a   .   5
2   c   12  6
3   e   .   3
4   b   .   7
5   f   .   8
6   e   .   9
7   e   11  8
8   c   .   3
9   c   52  5
10  a   .   6
11  b   4   7
12  f   .   2
13  f   .   10
14  d   .   12
15  d   .   13
16  e   .   24
17  a   1   54
18  b   2   19
19  c   5   21

我有以下解决方案,但它无效。有任何建议或帮助吗?感谢。

index <- with(one, D2 %in% c('a','c','d','e'))
one$D4[index] <- one$D3[index]
one

2 个答案:

答案 0 :(得分:2)

假设你确实有&#34;。&#34;在数据中,并且数据作为字符而不是数字/ NA读入,以下解决方案应该比with()调用更容易理解:

d <- read.table(header=T, stringsAsFactors=F, text=
"D1  D2  D3  D4
1   a   .   5
2   c   12  6
3   e   .   3
4   b   .   7
5   f   .   8
6   e   .   9
7   e   11  8
8   c   .   3
9   c   52  5
10  a   .   6
11  b   4   7
12  f   .   2
13  f   .   10
14  d   .   12
15  d   .   13
16  e   .   24
17  a   1   54
18  b   2   19
19  c   5   21"
)

indices <- d$D2 %in% c("a","c","d","e") & d$D3 == "."
d$D3[ indices ] <- d$D4[ indices ]

如果你确实有NAs而不是&#34;。&#34;您可以轻松地使用is.na(d$D3)作为矢量索引。

答案 1 :(得分:1)

另一种方法是在阅读表格时使用na.strings,然后使用ifelse。略显冗长但易于理解!

d <- read.table(header=T, stringsAsFactors=F, na.strings=".", text=
                  "D1  D2  D3  D4
1   a   .   5
2   c   12  6
3   e   .   3
4   b   .   7
5   f   .   8
6   e   .   9
7   e   11  8
8   c   .   3
9   c   52  5
10  a   .   6
11  b   4   7
12  f   .   2
13  f   .   10
14  d   .   12
15  d   .   13
16  e   .   24
17  a   1   54
18  b   2   19
19  c   5   21"
)


d$D3 <- ifelse(is.na(d$D3) & (d$D2 == 'a' | d$D2 == 'c' | d$D2 == 'd' | d$D2 == 'e'), d$D4, d$D3)