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

问题描述 投票:2回答:1

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

结果数据框看起来如下所示。但是我有一个非常大的数据框,并且还希望将值替换为chr“NA”

stock_r <-c('NA','2','3')
stock_r2 <-c('1','NA','3')

result_stock <- data.frame(stock_r,stock_r2)

提前谢谢你的帮助!

r dataframe compare
1个回答
2
投票

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

我将使用dplyr函数mutate_all,但是有一些apply函数的基本R族的解决方案,如果你是R的新手,你可能想要开始。有许多方法可以实现解决方案,但我是如果该值分别高于零或低于0,则将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
© www.soinside.com 2019 - 2024. All rights reserved.