我有一个数据框,其中包含一些缺少值,我想从其他日期框架中取出并插入第一个。当我想要补充的值在第一个数据帧的所有行中丢失时,这种方法就可以工作。
这是一个有效的例子:
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
到目前为止,谢谢大家的帮助。但我必须承认,我对你的解决方案并不满意。
您建议采用四步法:将一个数据框添加到另一个,将值逐个移动到所需目标,然后删除现在多余的辅助列。作为架构,您的解决方案如下所示:
这对我来说似乎非常复杂!
当我查看我的数据时,对我来说似乎很明显的解决方案只有一步:从一个数据框中剪切“矩阵”并将其粘贴到另一个数据框的“空”区域。以下是我的想法:
显然这实际上是可能的:
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()
的方法,即使行数不相同?
答案 0 :(得分:1)
您正尝试分配这三行:
> match(dat$code, age.and.sex$code)
[1] 1 2 NA
因为dat$code
和age.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以了解有关联接的更多信息。