我在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)
谢谢您的帮助!
答案 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