3

合并两个单独的数据集后,我在数据集中有两列。我想将这些列合并为一列,BNR.x。

对于下面列出的情况,我的首选结果是:
1. 没有。BNR.x 有数据,没关系。
2. 什么都没有。两列中的数据相同,这很好。
3. BNR.y 中的数据被复制到 BNR.x
4. 没有。同 2。
5. 列中的数据不同。最好我会在这一行中得到一个带有 FALSE 1 的额外列作为警告。
6. 没有数据。最好我也会在这里收到警告,通知我我没有此项目的任何数据。

+----+-------+-------+
| ID | BNR.x | BNR.y |
+----+-------+-------+
|  1 | 123   | NA    |
|  2 | 234   | 234   |
|  3 | NA    | 345   |
|  4 | 456   | 456   |
|  5 | 678   | 677   |
|  6 | NA    | NA    |
+----+-------+-------+

有没有可以为我做这件事的方法或包?

4

3 回答 3

2

这是一个建议。dat是数据框的名称:

idx <- is.na(dat$BNR.x) # create logical index for NAs in BNR.x

dat$BNR.x[idx] <- dat$BNR.y[idx] # replace NAs with values from BNR.y

# Add a logical column:
dat <- transform(dat, warn = is.na(BNR.x) | (BNR.x != BNR.y & !is.na(BNR.y)))

结果:

  ID BNR.x BNR.y  warn
1  1   123    NA FALSE
2  2   234   234 FALSE
3  3   345   345 FALSE
4  4   456   456 FALSE
5  5   678   677  TRUE
6  6    NA    NA  TRUE
于 2013-02-11T12:58:35.950 回答
1

如果您的数据位于名为的数据框中d,您可以执行以下操作:

## Copy BNR.y if BNR.x is missing
d$BNR.x[is.na(d$BNR.x)] <- d$BNR.y[is.na(d$BNR.x)]
## List the indices of BNR.x that are still missing
which(is.na(d$BNR.x))
## List the indices where BNR.x is different from BNR.y
which(d$BNR.x != d$BNR.y)
于 2013-02-11T12:50:58.410 回答
0

从:

df
V1  V2  V3
1  1 123  NA
...

df[which(is.na(df$V2)),]$V2 <- df[which(is.na(df$V2)),]$V3
df$warn <- 0
df[which(is.na(df$V2)),]$warn <- 1
df[which(df$V2 != df$V3 & !is.na(df$V3)),]$warn <- 1

好的,过度使用 which 和 transform 更好,但我必须从某个地方开始 :)

附言。我错了还是

d$BNR.x[is.na(d$BNR.x)] <- d$BNR.y

不起作用,因为它会将“错误对齐”的 BNR$y 值与 BNR$x NA 相对应?

于 2013-02-11T13:25:58.847 回答