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

时间:2018-11-29 00:12:54

标签: r dataframe compare

我在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)

谢谢您的帮助!

1 个答案:

答案 0 :(得分:2)

首先,通过在向量中的值两边加上引号,数据框最终将成为因子列而不是数字列(如果使用默认的stringsAsFactors系统选项)。我在下面输入的代码的前2行解决了该问题,但是如果您以其他方式输入数据,则可以跳过这些行。

我将使用dplyr函数mutate_all,但是如果您是新手,可能会从apply函数的基本R系列中获得一些解决方案到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