【问题标题】:Generate column if other columns are equal如果其他列相等,则生成列
【发布时间】:2017-12-28 10:54:37
【问题描述】:

我有两个数据框:

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 <- data.frame('ID'=c(1, 2, 2, 4, 5, 7, 8, 11, 12), 
              'invoice'=c(40000, 41000, 39000, 43000, 44000, 46000, 
               47000, 40000, 41000),
              'settle'=c(24000, 25000, 21000, 27000, 28000, 30000, 
               31000, 24000, 25000),
              'amount'=c(10, 20, 20, 10, 20, 10, 20, 10, 10), 
              'reason'=c(4, 5, 5, 4, 5, 4, 5, 4, 4))

df1:

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

df2:

ID invoice settle amount reason
 1   40000  24000     10      4
 2   41000  25000     20      5
 2   39000  21000     20      5
 4   43000  27000     10      4
 5   44000  28000     20      5
 7   46000  30000     10      4 
 8   47000  31000     20      5
11   40000  24000     10      4
12   41000  25000     10      4

所以我想根据以下条件在 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)

我收到警告消息:

 "longer object length is not a multiple of shorter object length"

所以我认为 ifelse 是不可能的,因为我的两个数据框大小不同(df1 中的 ID 多于 df2 中的 ID)。

你能帮我解决这个问题吗?

在 SPSS 或 Stata 中,我只使用 IF 命令,但 R 对我来说很新!

编辑

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

【问题讨论】:

  • 也许你需要%in%而不是==
  • 对于给定的测试数据,你期望只有 0?
  • @Dennis:不,我添加了 df1 的视图,作为我希望新变量最终出现在我的测试数据中的方式。

标签: r if-statement dataframe


【解决方案1】:

错误是因为您的两个数据框的行数不同。

尝试先按条件连接两个表,然后在 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)

【讨论】:

  • hmm 仅适用于测试数据,不适用于我的真实数据......当我知道有什么区别时,我会回来。左连接不起作用
  • 好的,我现在已经解决了,感谢您的帮助!在加入之前,我刚刚在我的 df2 中创建了我的新变量 = 1,然后它就在那里。我的真实数据的问题是,结算有时等于 NA。但这行得通!
猜你喜欢
  • 2018-05-29
  • 1970-01-01
  • 2019-10-21
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
相关资源
最近更新 更多