如果另一个数据帧值小于0,则替换R数据帧中的值



我在r中有两个大小相同的数据帧。我想做的是,如果第二个数据帧的值小于零,则删除第一个数据帧

例如如果killer_stock数据帧的值小于0,rank_stock中的值将替换为NA

stock <-c('1','2','3')
stock2 <-c('1','2','3')
rank_stock <- data.frame(stock,stock2)
stockc <-c('-1','2','3')
stock2c <-c('2','-1','1')
killer_stock <- data.frame(stockc,stock2c)

结果数据帧如下所示。但我有一个非常大的数据帧,我也想rm值,而不是用chr"NA"代替它

stock_r <-c('NA','2','3')
stock_r2 <-c('1','NA','3')
result_stock <- data.frame(stock_r,stock_r2)

提前感谢您的帮助!

首先,通过在向量中的值周围加引号,数据帧最终成为因子列,而不是数字列(如果使用默认的stringsAsFactors系统选项(。我在下面输入的前两行代码修复了这一问题,但如果您输入的数据不同,则可以跳过这些代码。

我将使用dplyr函数mutate_all,但如果你是R的新手,你可能想从apply函数的基本R族开始使用一些解决方案。有很多方法可以实现一个解决方案,但如果值高于零或低于零,我将分别将killer_stock数据帧转换为1和NA。然后,我将该数据帧元素与rank_stock数据帧相乘。NA乘以任何数字都是任意的,所以这些值将被转换。

library(dplyr)
# Convert to numeric
killer_stock <- killer_stock %>% mutate_all(as.character) %>% mutate_all(as.numeric)
rank_stock <- rank_stock %>% mutate_all(as.character) %>% mutate_all(as.numeric)
# Convert to 1 or NA
df <- killer_stock %>% mutate_all(funs(ifelse(. < 0, NA, 1)))
# Element-wise multiplication
rank_stock * df
stock stock2
1    NA      1
2     2     NA
3     3      3

最新更新