首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R/ Recoding NAs中组合调查项目

在R/ Recoding NAs中组合调查项目
EN

Stack Overflow用户
提问于 2011-01-11 22:17:02
回答 4查看 388关注 0票数 3

我有两个列表(来自多波调查),看起来像这样:

代码语言:javascript
复制
X1 X2
1  NA
NA  2
NA  NA

如何轻松地将其合并到第三项中,其中第三列始终采用列X1或X2的非NA值,并在这两个值都为NA时编码NA?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-11 23:15:26

结合Gavin对within的使用和Prasad对ifelse的使用,我们得到了一个更简单的答案。

代码语言:javascript
复制
within(df, x3 <- ifelse(is.na(x1), x2, x1))

不需要多个ifelse调用--当两个值都为NA时,您可以直接获取其中一个值。

票数 5
EN

Stack Overflow用户

发布于 2011-01-11 22:48:43

使用ifelse的另一种方式

代码语言:javascript
复制
df <- data.frame(x1 = c(1, NA, NA, 3), x2 = c(NA, 2, NA, 4))
> df
  x1 x2
1  1 NA
2 NA  2
3 NA NA
4  3  4

> transform(df, x3 = ifelse(is.na(x1), ifelse(is.na(x2), NA, x2), x1))
  x1 x2 x3
1  1 NA  1
2 NA  2  2
3 NA NA NA
4  3  4  3
票数 3
EN

Stack Overflow用户

发布于 2011-01-11 22:38:13

这需要一些额外的技巧,因为X1X2都可能是NA,但是这个函数可以用来解决您的问题:

代码语言:javascript
复制
foo <- function(x) {
    if(all(nas <- is.na(x))) {
        NA
    } else {
        x[!nas]
    }
}

我们通过将函数foo应用于数据的每一行来使用该函数(在这里,我将数据放在一个名为dat的对象中):

代码语言:javascript
复制
> apply(dat, 1, foo)
[1]  1  2 NA

这就给了我们想要的东西。要将其包含在对象中,我们执行以下操作:

代码语言:javascript
复制
> dat <- within(dat, X3 <- apply(dat, 1, foo))
> dat
  X1 X2 X3
1  1 NA  1
2 NA  2  2
3 NA NA NA
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4658538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档