首页 > 解决方案 > 基于R中的其他数据集向一个数据集添加一行

问题描述

我有两个数据集。目的是如果 df2 中出现新代码并且 df2$LABEL 设置为 PRIV,则向 df1 添加一行。我简单地尝试了 if 子句,但它对我不起作用。我想也许有 dplyr 库的解决方案。我使用的逻辑(也许会有帮助):

df1$CODE != df2$CODE & df2$LABEL == "PRIV"

具有 dput 的数据集的虚拟示例(首先是 df1,其次是 df2):

structure(list(OUTLETID = c("11N", "12B", "17C",                            
"44O"), CODE = c(4623,                                                                             
4623, 4111, 4343), 
PRICE = c(1.45, 1.45, 5.45, 5.03), LABEL = c("PRIV", "PRIV", "NON PRIV", "NON PRIV")), 
row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame"))

structure(list(CODE = c(4623, 4205, 4551), 
PRICE = c(1.45, 1.17, 5.99), LABEL = c("PRIV", "PRIV", "NON PRIV")), 
row.names = c(NA, -3L), class = c("tbl_df", "tbl", "data.frame"))

因此,在本例中,应将 CODE=4205、PRICE=1.17 和 LABEL="PRIV" 的新行添加到 df1。与 df2 一样,没有 OUTLETID,在该列中应该只是 NA。这段代码应该适用于一般情况,更大的数据集,而不仅仅是这个小例子。

标签: rdataframeif-statementdplyr

解决方案


由于您必须处理大型数据集,请在下面找到该软件包的解决方案data.table

library(data.table)

setDT(df1)
setDT(df2)

rbind(df1,df2[CODE %in% setdiff(df2$CODE, df1$CODE) & LABEL == "PRIV",], fill = TRUE)
#>    OUTLETID CODE PRICE    LABEL
#> 1:      11N 4623  1.45     PRIV
#> 2:      12B 4623  1.45     PRIV
#> 3:      17C 4111  5.45 NON PRIV
#> 4:      44O 4343  5.03 NON PRIV
#> 5:     <NA> 4205  1.17     PRIV

我不清楚您是否想从df1. 因此,如果您想同时删除带有“NON PRIV”标签的行,df1可以使用以下代码行:

rbind(df1[LABEL == "PRIV"],df2[CODE %in% setdiff(df2$CODE, df1$CODE) & LABEL == "PRIV",], fill = TRUE)
#>    OUTLETID CODE PRICE LABEL
#> 1:      11N 4623  1.45  PRIV
#> 2:      12B 4623  1.45  PRIV
#> 3:     <NA> 4205  1.17  PRIV

reprex 包(v0.3.0)于 2021 年 10 月 26 日创建


推荐阅读