我想替换一个变量的值。
这是我的dB:
head(mydb)
ID V1 V2 V3 V4
1 value value 0 0
2 value value 0 0
3 value value 0 0
4 value value 0 0
5 value value 0 0
6 value value 0 0
V3
和V4
的所有观测值都有**0
**。
然后我创建了几个DB,如下所示:
head(newdb)
ID V3 V4
2 5 4
4 8 5
6 9 6
我想得到这样的东西:
ID V1 V2 V3 V4
1 value value 0 0
2 value value 5 4
3 value value 0 0
4 value value 8 5
5 value value 0 0
6 value value 9 6
我试着用sqldf这样做:
mydf <- sqldf('SELECT mydf.*, newdb.v3, newdb.v4
FROM mydf
LEFT JOIN newdb
ON mydf.ID = newdb.id')
我创建的代码工作得很好,做好了它的工作;但问题是,我在for循环中,对于我的每个newDB
,sql
代码都会生成其他V3
和V4
,并将其附加到前一个循环中,创建如下内容:
ID V1 V2 V3 V4 V3 V4 V3 V4
1 value value 0 0 1 5 0 0
2 value value 5 4 0 0 0 0
3 value value 0 0 0 0 7 8
4 value value 8 5 0 0 0 0
5 value value 0 0 2 2 0 0
6 value value 9 6 0 0 0 0
我为循环的每次迭代(在本例中为3次迭代)添加了另一个V3和V4列。
我怎样才能避免这个问题?
3条答案
按热度按时间k10s72fa1#
使用data.table可以很容易地进行更新连接
您也可以使用
sqldf
,但必须使用coalesce
(与上面的结果相同)所用数据:
alen0pnh2#
您可以简单地匹配两个 Dataframe 中的ID并将其替换为原始 Dataframe :
稍后您可以将
NA
s替换为0
s。更新日期:
而不是做一个
for-loop
连接所有的newdf
在一起,然后运行代码;请看下面的伪代码:wvt8vs2t3#
我们可以使用我的包safejoin中的
eat
,并在列冲突时将匹配从rhs“修补”到rhs中。我们也可以合并从rhs开始的列,以达到相同的效果: