我有一个名为one
的数据集,其中有四列:D1
,D2
,D3
和D4
。 D1
是id。 D2
有七个级别(a
,b
,c
,d
,e
,f
,g
)。 D3
缺少数据,我希望通过匹配列D2
和D4
中的条件来填充这些数据。我正在从列D4
的四个级别(a
,c
,d
,e
)对应的列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
答案 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)