【问题标题】:R code for substituting values from one column to the missing values in another column用于将一列中的值替换为另一列中的缺失值的 R 代码
【发布时间】:2015-05-06 12:03:49
【问题描述】:

我有一个名为 one 的数据集,有四列:D1、D2、D3 和 D4。 D1 是 ID。 D2 有七个级别(a、b、c、d、e、f、g)。 D3 缺少数据,我想通过匹配列 D2 和 D4 的条件来填充这些数据。我从列D4 中选择对应于D2 列的四个级别(a、c、d、e)的值,然后用来自@ 的值替换列D3 的缺失值987654345@。

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

【问题讨论】:

  • 描述有点不清楚。如果 D2 在 (a, c, d, e) 中,是否要用 D4 中的值填充 D3 中的缺失值?这就是我从问题的第一部分所理解的,但问题的后半部分和代码实际上是将 NA 添加到 D4。也许,告诉我们 D3 和 D4 对于第 1、4 和 17 行的期望结果是什么。
  • 您的 . 应该是 NA,否则 D3 将是字符串/因子。这是否符合您的要求,我不确定with(df, ifelse(is.na(D3) &amp; D2 %in% letters[1:5], D4, D3))
  • 你能提供一些例子吗?例如,D3 中的第一个缺失值是什么?为什么?

标签: r if-statement na


【解决方案1】:

假设您确实有“。”在数据中,并且数据作为字符而不是数字/NAs 读入,以下解决方案应该比 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 ]

如果您确实有 NA 而不是“。”您可以轻松地使用 is.na(d$D3) 作为矢量索引的字符。

【讨论】:

    【解决方案2】:

    另一种方法是在读取表格时使用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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-27
      • 2019-05-12
      • 1970-01-01
      • 2019-03-28
      • 2015-11-21
      • 1970-01-01
      • 2023-01-13
      相关资源
      最近更新 更多