如果差值小于零,则将两个数据帧中的值替换为null

时间:2016-07-25 09:34:34

标签: r

我想将两个数据框和特定列中的值设置为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中的值设置为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

感谢。

3 个答案:

答案 0 :(得分:0)

这是你提供的:

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 > 0对其进行索引:

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

答案 1 :(得分:0)

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

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,否则(否则)是减法的结果。此代码导致

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

答案 2 :(得分:0)

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

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