【问题标题】:what is the appropriate way to edit two different objects based on if statement?根据 if 语句编辑两个不同对象的适当方法是什么?
【发布时间】:2019-07-12 16:58:31
【问题描述】:

我只想在第二列满足条件时编辑 df 的列,并且还要跟踪条件何时为假。这样做的适当方法是什么?

我尝试过使用ifelse(),但始终执行真假代码。另外,这似乎是错误的方法,因为我不想要ifelse 向量输出。 (这里我只想评估每个ID的第一行)。

df <- data.frame(id = rep(c(1,2,3), each = 2), value = rep(c(4,7,-8), 
each = 2), new_val = rep(0, each=6))

neg_val <- vector()

ifelse(df[!duplicated(df$id), "value"] > 0,
    df[!duplicated(df$id), "new_val"] <- df[!duplicated(df$id),"value"], 
    neg_val <- append(neg_val, df[!duplicated(df$id), "id"]))

[1] 4 7 3
> neg_val
[1] 1 2 3

ifelse 的输出与我预期的一样,是正值或负值的 ID。但是df 会针对所有值进行更新,而不仅仅是当value &gt; 0neg_val 包含所有ID 而我只想要values =&lt; 0 的ID 时。期望的输出:

> df
  id value new_val
1  1     4       4
2  1     4       0
3  2     7       7
4  2     7       0
5  3    -8       0
6  3    -8       0
> neg_val
[1] 3

【问题讨论】:

  • 您不想更新new_val 中的第一行重复项吗?这就是我得到的。请澄清。最好的办法是使用 edit(不在 cmets 中)将您想要的 df 输出添加到问题正文中。

标签: r if-statement apply


【解决方案1】:

这个呢?这就是你要找的吗?

df[!duplicated(df$id), "new_val"]<-ifelse(df[!duplicated(df$id), "value"] > 0,
       df[!duplicated(df$id), "new_val"] <- df[!duplicated(df$id),"value"], 
       df[!duplicated(df$id), "new_val"] <- df[!duplicated(df$id),"id"])
neg_val<-ifelse(df[!duplicated(df$id), "value"] > 0,
       NA,df[!duplicated(df$id),"id"])
neg_val<-na.omit(neg_val)

【讨论】:

  • 有效,但我认为有一种方法可以做到这一点而无需重复 ifelse
猜你喜欢
  • 1970-01-01
  • 2023-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-26
  • 1970-01-01
相关资源
最近更新 更多