R 如果其他列相等,则生成列

R 如果其他列相等,则生成列,r,if-statement,dataframe,R,If Statement,Dataframe,我有两个数据帧: df1 <- data.frame('ID'=c(1, 1, 2, 2, 3, 4, 5, 6, 7, 8, 8, 9, 10), 'invoice'=c(24000, 21000, 25000, 21000, 26000, 27000, 28000, 29000, 30000, 31000, 21000, 32000, 33000), 'settle'=c(40000, 40000,

我有两个数据帧:

df1 <- data.frame('ID'=c(1, 1, 2, 2, 3, 4, 5, 6, 7, 8, 8, 9, 10), 
              'invoice'=c(24000, 21000, 25000, 21000, 26000, 27000,
               28000, 29000, 30000, 31000, 21000, 32000, 33000),
              'settle'=c(40000, 40000, 41000, 41000, 42000, 43000, 44000,
               45000, 46000, 47000, 47000, 48000, 49000), 
              'amount'=c(10, 10, 20, 10, 30, 10, 20, 30, 10, 20, 
               10, 30, 10), 
              'reason'=c(4, 5, 5, 5, 9, 4, 5, 9, 4, 5, 5, 15, 8))
df2:

因此,我想根据以下条件在df1中生成一个虚拟变量:

if df1$ID == df2$ID
if df1$settle == df2$invoice
if df1$amount == df2$amount
if df1$reason == df2$reason
因此,如果满足条件,我的新列应该等于1,否则等于0

带有新变量的df1如下所示:

 ID invoice settle  amount reason  newvar
 1   24000  40000     10      4      1
 1   21000  40000     10      5      0
 2   25000  41000     20      5      1
 2   21000  41000     10      5      0
 3   26000  42000     30      9      0
 4   27000  43000     10      4      1
 5   28000  44000     20      5      1
 6   29000  45000     30      9      0
 7   30000  46000     10      4      1
 8   31000  47000     20      5      1
 8   21000  47000     10      5      0
 9   32000  48000     30     15      0
10   33000  49000     10      8      0
我试过:

 df1$newvar <- ifelse(df1$ID == df2$ID & 
                      df1$settle == df2$invoice &
                      df1$amount == df2$amount &
                      df1$reason == df2$reason, 1, 0)
因此,我认为ifelse是不可能的,因为我的两个数据帧在df1中的大小不同,在df2中的ID也不同

你能帮我解决这个问题吗

在SPSS或Stata中,我只会使用IF命令,但R对我来说是相当陌生的

编辑

我已经更改了我的测试数据帧,因此它们与我使用的数据帧更相似。
我还添加了一个带有新变量的df1视图

错误是因为两个数据帧的行数不同

尝试先按条件连接两个表,然后在df1上创建新列

df1<-left_join(df1,df2,by=c("ID"="ID","settle"="invoice","amount"="amount","reason"="reason"))
df1<-df1 %>% mutate(newvar=ifelse(is.na(settle.y),0,1)) %>%
             select(-settle.y)

也许你需要%in%而不是==对于给定的测试数据,你只需要0吗?@Dennis:不,我已经添加了一个df1视图,作为我希望新变量如何在我的测试数据中结束的视图。hmm仅适用于测试数据,而不适用于我的真实数据。。。我知道有什么区别后会回来的。左路连接不起作用,所以我现在已经解决了,多亏了你的帮助!在加入之前,我刚刚在df2中创建了新变量=1,然后它就在那里了。我的真实数据的问题是,沉降有时等于NA。但这是有效的!
 ID invoice settle  amount reason  newvar
 1   24000  40000     10      4      1
 1   21000  40000     10      5      0
 2   25000  41000     20      5      1
 2   21000  41000     10      5      0
 3   26000  42000     30      9      0
 4   27000  43000     10      4      1
 5   28000  44000     20      5      1
 6   29000  45000     30      9      0
 7   30000  46000     10      4      1
 8   31000  47000     20      5      1
 8   21000  47000     10      5      0
 9   32000  48000     30     15      0
10   33000  49000     10      8      0
 df1$newvar <- ifelse(df1$ID == df2$ID & 
                      df1$settle == df2$invoice &
                      df1$amount == df2$amount &
                      df1$reason == df2$reason, 1, 0)
 "longer object length is not a multiple of shorter object length"
df1<-left_join(df1,df2,by=c("ID"="ID","settle"="invoice","amount"="amount","reason"="reason"))
df1<-df1 %>% mutate(newvar=ifelse(is.na(settle.y),0,1)) %>%
             select(-settle.y)