【发布时间】:2016-03-17 14:50:30
【问题描述】:
我有一个数据框,其中包含一些缺失值,我想从另一个日期框中获取并插入到第一个中。当我要补充的值在第一个数据帧的所有行中缺失时,此方法有效。
这是一个工作示例:
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
问题是,当我没有从最火的数据框中的所有行中丢失值,但我只需要补充某些行时,我会收到错误。
这是一个不起作用的例子:
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(),即使行数不一样?
【问题讨论】:
-
你在做
x[match(y,z)] <- w但match(y,z)里面有一些NA,所以它不能分配。 -
我可能会使用更多的“左连接,然后合并/ifelse 缺少值的列”的策略。
-
@what...我打错了...忘记了
by部分。应该阅读merge(dat, age.and.sex, by="code", all.x=TRUE) -
这似乎有效:
cbind(code=dat[,1],rbind(age.and.sex[,2:3],dat[3,2:3]),more=dat[,4]) -
不要避免学习加入!要意识到的是,即使您确实找到了使用
match的解决方案,您基本上还是手动计算连接,然后查找连接的列。所以本质上你是在重新发明轮子。想想你原来的match解决方案的逻辑:“在age.and.sex中找到code列与dat中的行匹配的行,然后从age.and.sex中获取相应的其他列。”好吧,这正是连接(或merge)的工作方式:从连接表中查找第一个表中by列匹配的列。
标签: r