我有3列 . 第一列已完成,但第二列和第三列不完整,我想根据所有3列中的现有值完成它们 . 这是一个例子:
number a b
1 Q V
2 R W
3 S X
4 T Y
5 U Z
3 S X
2 R W
4 T Y
1 Q V
5 U Z
4
1
5
3
2
2
4
3
5
1
我需要做的是转到“a”列中的第一个空值,查看“number”(4)列中的值,找到对应于“number”的“a”和“b”的值(4) ),然后将这些值插入“a”和“b”列 - 然后转到下一个缺失值 .
我使用两个数据帧来实现一个解决方案 . 一个名为“df”的数据帧是本文开头显示的原始表,第二个数据帧(称为“df2”)是一个键:
number a b
1 Q V
2 R W
3 S X
4 T Y
5 U Z
3 S X
2 R W
4 T Y
1 Q V
5 U Z
然后,我可以使用df1中的值填充df值
df$a <- df2$a[ match(df$number, df2$number)]
df$b <- df2$b[ match(df$number, df2$number)]
这给了新的df
number a b
1 Q V
2 R W
3 S X
4 T Y
5 U Z
3 S X
2 R W
4 T Y
1 Q V
5 U Z
4 T Y
1 Q V
5 U Z
3 S X
2 R W
2 R W
4 T Y
3 S X
5 U Z
1 Q V
这似乎对我有用!但是,我有一些悬而未决的问题/问题:
1)有没有更优雅或有效的方法来做到这一点,最好只使用单个数据帧df?
2)要匹配“数字”,此方法是否只使用该列中匹配的第一个实例?
3)是否有一种好方法可以测试现有的“a”和“b”值是否已正确分配(即同一“数字”的每个实例都具有相同的“a”和“b” . 这与问题#有关2正上方 .
感谢您的任何建议!
3 回答
我认为DWin在这里有正确的想法,但没有理由创建额外的数据框架 . 'match'函数只查找第一个匹配项,因此我们不必担心数据帧的其余部分 . 您可以像这样缩写他的代码:
就是这样 .
用简单的英语,这段代码说:“对于设置的行缺少'a'的值,找到缺少的行中与'number'匹配的'number'列中的第一行,并将整个匹配的行写入旧的行 . ”
构建两个data.frames:
然后从samller中获取匹配的行以填充缺失的数据:
如果你告诉我们你将如何提供这些数据,那将是很好的,因为那些将回答更准确答案的人 .
python中提供了解决方案的概念 .
如果那就是你想要的,请告诉我 .