我在 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,如果值为分别高于零或低于零。然后,我将该数据帧按元素与 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
关于如果另一个数据帧值小于 0,则替换 R 数据帧中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53530027/