“下属作业中不允许使用NA”

时间:2016-03-17 14:50:30

标签: r

我有一个数据框,其中包含一些缺少值,我想从其他日期框架中取出并插入第一个。当我想要补充的值在第一个数据帧的所有行中丢失时,这种方法就可以工作。

这是一个有效的例子:

dat <- data.frame(code = c("A11", "B22"),
                  age = c(NA, NA),
                  sex = c(NA, NA),
                  more = c(7, 4),
                  stringsAsFactors = FALSE)

age.and.sex <- read.table(textConnection("
code age sex
A11 15 m
B22 10 f
"), header = TRUE, stringsAsFactors = FALSE)

dat$sex[match(dat$code, age.and.sex$code)] <- age.and.sex$sex
dat$age[match(dat$code, age.and.sex$code)] <- age.and.sex$age

dat
  code age sex more
1  A11  15   m    7
2  B22  10   f    4

问题在于,当我在firest数据框中的所有行中都没有丢失值时,但我只需要补充某些行,我就会收到错误。

以下是一个不起作用的示例:

dat <- data.frame(code = c("A11", "B22", "C33"),
                  age = c(NA, NA, 12),
                  sex = c(NA, NA, "m"),
                  more = c(7, 4, 9),
                  stringsAsFactors = FALSE)

age.and.sex <- read.table(textConnection("
code age sex
A11 15 m
B22 10 f
"), header = TRUE, stringsAsFactors = FALSE)

dat$sex[match(dat$code, age.and.sex$code)] <- age.and.sex$sex
Error in dat$age[match(dat$code, age.and.sex$code)] <- age.and.sex$age : 
  NAs are not allowed in subscripted assignments
dat$age[match(dat$code, age.and.sex$code)] <- age.and.sex$age
Error in dat$age[match(dat$code, age.and.sex$code)] <- age.and.sex$age : 
  NAs are not allowed in subscripted assignments

我不明白R返回的错误。

如何更改我的代码以使其再次运行?

我想要达到的结果是:

dat
  code age sex more
1  A11  15   m    7
2  B22  10   f    4
3  C33  12   m    9

到目前为止,谢谢大家的帮助。但我必须承认,我对你的解决方案并不满意。

您建议采用四步法:将一个数据框添加到另一个,将值逐个移动到所需目标,然后删除现在多余的辅助列。作为架构,您的解决方案如下所示:

enter image description here

这对我来说似乎非常复杂!

当我查看我的数据时,对我来说似乎很明显的解决方案只有一步:从一个数据框中剪切“矩阵”并将其粘贴到另一个数据框的“空”区域。以下是我的想法:

enter image description here

显然这实际上是可能的:

dat[1:2,2:3] <- age.and.sex[1:2,2:3]
dat
  code age sex more
1  A11  15   m    7
2  B22  10   f    4
3  C33  12   m    9

当然,这只有在两个数据帧以相同方式排序时才有效。这就是我使用match()的原因,它在行没有排序时克服了这个问题 - 但是当行数不相同时就​​失败了。

或者有match()的方法,即使行数不相同?

1 个答案:

答案 0 :(得分:1)

您正尝试分配这三行:

> match(dat$code, age.and.sex$code)
[1]  1  2 NA

因为dat$codeage.and.sex$code的长度不同,所以第三个比较是NA

我不确定您的匹配实际意味着什么,但您可能只是尝试对前两个观察进行子集化,或na.omit等。

但是,从两个表连接数据的更好方法是使用join

library(data.table)
dat <- data.table(dat)
setkey(dat,code)
age.and.sex <- data.table(age.and.sex)
setkey(age.and.sex,code)
dat[age.and.sex]
> dat[age.and.sex]
   code age sex more i.age i.sex
1:  A11  NA   m    7    15     m
2:  B22  NA   f    4    10     f

注意内部表的列如何附加到外部表的列。

更多... Per @joran的建议......您可以使用此技术填写缺失的观察结果:

joined <- dat[age.and.sex]
joined[is.na(age),age:=i.age] #only replace the value missing from left table
joined[,c("i.age","i.sex"):=NULL]
joined
> joined
   code age sex more
1:  A11  15   m    7
2:  B22  10   f    4

更新以解决您的评论...只需撤消加入。有一些更聪明的方法可以减少手动操作,但这应该很容易遵循:

joined <- age.and.sex[dat]
joined[is.na(age),age:=i.age]
joined[is.na(sex),sex:=i.sex]
joined[,c("i.age","i.sex"):=NULL]
> joined
   code age sex more
1:  A11  15   m    7
2:  B22  10   f    4
3:  C33  12   m    9

如果您喜欢这种技巧,那么您一定要阅读?data.table和相关的vignette以了解有关联接的更多信息。