【问题标题】:Calculate value in third column based off values in other columns but different rows根据其他列但不同行中的值计算第三列中的值
【发布时间】:2019-10-11 14:45:36
【问题描述】:

对不起,如果这是一个微不足道的问题或没有意义,这是我的第一篇文章。我来自 Excel,在那里我使用过 if 语句和索引匹配函数,并试图在 R 中做类似的事情来从两列中提取数据,但不一定是同一行来获取第三列中的值,我的例子这是吗

df<-data.frame(ID=c(1,5,4,2,3),A=c(1,0,1,1,1),B=c(0,0,1,0,0))

期望的输出:df

我想要创建基本上遵循这种格式的第三列“C”:

Ifelse(A[ID]=1 & B[ID+1]=1 , C[ID]=1 , C[ID]=0)

基本上如果A=1 in ID "x" 和 B=1 in ID "x+1" 那么在 ID "x" 的新列 C 中 =1 否则 =0。如果这样做更容易,我可以按 ID 对所有内容进行排序,但按 ID 列进行排序是理想的。

到目前为止,我已经尝试过 ifelse 语句,但我想可能有更好的方法来做到这一点

【问题讨论】:

  • 您的预期输出是什么样的?
  • df

标签: r if-statement


【解决方案1】:

使用dplyr,我们可以使用lead将数据按ID排列后得到下一个元素。

library(dplyr)
df %>%
  arrange(ID) %>%
  mutate(C = as.integer(A == 1 & lead(B) == 1))

#  ID A B C
#1  1 1 0 0
#2  2 1 0 0
#3  3 1 0 1
#4  4 1 1 0
#5  5 0 0 0

在base R中,我们可以做

df1 <- df[order(df$ID),]
df1$C <- with(df1, c(A[-nrow(df)] == 1 & tail(B, -1) == 1, 0))

不整理数据,我们大概可以做

transform(df, C = as.integer(A[ID] == 1 & B[match(ID + 1, ID)] == 1))

【讨论】:

  • 我想我有一个变体可以工作。出于好奇而不按 ID 排列,是否有任何其他方法可以做到这一点,或者跳到比后面或前面的值更多的值?
  • @CC90 将答案更新为具有C 值,而不按ID 排列数据。
  • 您在基础 R 中的第二个解决方案似乎在与 B 相同的行中返回“1”: ID=c(1,2,3,4,5),A=c(1,1 ,1,1,0),B=c(0,0,0,1,0),C=c(0,0,0,1,0))
  • @CC90 yes 0 应该在最后。谢谢,更新了答案:)
【解决方案2】:

使用lead函数我得到了这个工作

df

df$C

【讨论】:

  • 您应该接受一个有效的答案,而不是添加与另一个相同的答案。勾选上述答案下方的“勾号”。
猜你喜欢
  • 1970-01-01
  • 2019-03-09
  • 2020-11-16
  • 2022-01-01
  • 1970-01-01
  • 2019-12-16
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多