【问题标题】:Replace values in two data frames with null if difference is below zero如果差值小于零,则将两个数据帧中的值替换为 null
【发布时间】:2016-07-25 09:34:33
【问题描述】:

如果减去时会导致负值,我想将两个数据框和特定列中的值设置为 null。

例如,如果我有 df1 和 df2,如下所示:

df1 <- cbind(v1=c(3,6,4,8,4), v2=c(8,6,7,3,5), v3=c(7,6,8,5,8))
df2 <- cbind(v1=c(5,3,8,7,9), v2=c(1,1,7,4,5), v3=c(7,1,2,5,3))

我有一个列名向量:

v <- c('v1', 'v3')

使用以下减法的结果:

df2[,v]-df1[,v] < 0

v1    v3
FALSE FALSE
TRUE  TRUE
FALSE  TRUE
TRUE FALSE
FALSE  TRUE

如果 df1 和 df2 中的值为 true,我想将它们设置为 null。

预期结果:

df1:

v1    v2    v3
3     8     7
NA    6     NA
4     7     NA
NA    3     5
4     5     NA

df2:

v1    v2    v3
5     1     7
NA    1     NA
8     7     NA
NA    4     5
9     5     NA

谢谢。

【问题讨论】:

  • 请包括预期的输出和您尝试过的内容。

标签: r


【解决方案1】:

如果我正确理解您的问题,我会得到以下信息:

df1 <- cbind(v1=c(3,6,4,8,4), v2=c(8,6,7,3,5), v3=c(7,6,8,5,8))
df2 <- cbind(v1=c(5,3,8,7,9), v2=c(1,1,7,4,5), v3=c(7,1,2,5,3))
v <- c('v1', 'v3')

ifelse(df2[,v] - df1[,v]<0,NA,df2[,v]-df1[,v])

ifelse函数的使用如下...如果减法小于0,则答案为NA,如果不是(else)则为减法的结果。这段代码导致,

     v1 v3
[1,]  2  0
[2,] NA NA
[3,]  4 NA
[4,] NA  0
[5,]  5 NA

【讨论】:

  • 此答案不再与您提出的问题相关,因为您编辑了问题,使其提出的问题与您的原始问题完全不同。
【解决方案2】:

这是你提供的:

df1 <- cbind(v1=c(3,6,4,8,4), v2=c(8,6,7,3,5), v3=c(7,6,8,5,8))
df2 <- cbind(v1=c(5,3,8,7,9), v2=c(1,1,7,4,5), v3=c(7,1,2,5,3))
v <- c('v1', 'v3')

现在将df2[,v] - df1[,v] 的结果保存到df3

# intermediate step:
df3 <- df2[,v]-df1[,v]

df3 中的所有正值替换为0(或与此相关的任何值)

df3[df3 > 0] <- 0
df3

编辑:

如果您希望替换 df1df2 中的值,请使用 df3 &gt; 0 对其进行索引:

df1[df3 > 0] <- 0     # or some other value than 0
df2[df3 > 0] <- 0     # or some other value than 0

【讨论】:

    【解决方案3】:

    我能够通过计算子集 v 的差异并使用结果替换 df1 和 df2 中的子集 v 值来实现这一点:

    df3 <- df1[,v]-df2[,v]
    df1[,v][df3<0] <- NA
    df2[,v][df3<0] <- NA
    

    【讨论】:

      猜你喜欢
      • 2022-01-13
      • 1970-01-01
      • 2019-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-02
      • 2015-12-19
      • 1970-01-01
      相关资源
      最近更新 更多