【问题标题】:Replacing Values in a R Dataframe if another Dataframe value is Less than 0如果另一个 Dataframe 值小于 0,则替换 R Dataframe 中的值
【发布时间】:2018-11-29 00:12:53
【问题描述】:

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

提前感谢您的帮助!

【问题讨论】:

    标签: r dataframe compare


    【解决方案1】:

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

    我将使用 dplyr 函数 mutate_all,但是如果您是 R 新手,您可能想要开始使用 apply 函数的基本 R 系列的解决方案。有很多实现解决方案的方法,但我将 killer_stock 数据帧转换为 1 和 NA 如果值分别高于或低于零。然后我将该数据框元素与rank_stock 数据框相乘。 NAtimes any number is any,所以这些值会被转换。

    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
    

    【讨论】:

    • 但是有没有办法使用 BASE R 函数将 killer_stock 数据帧更改为 1 和 NA?
    • 我现在想远离 dplyr,因为它会弄乱我的其他代码
    • sapply(killer_stock, function(x) ifelse(x &lt; 0, NA, 1)) 将生成一个值矩阵并以相同的方式乘以 rank_stock 数据帧。为什么你认为它会弄乱你的其余代码?你也在用plyr包吗?
    • 我刚刚做了 x[x
    • 是的,rank_stock[killer_stock&lt;0] &lt;- NA 也可以
    猜你喜欢
    • 2021-09-28
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 2021-02-25
    • 2022-08-19
    • 2022-01-06
    相关资源
    最近更新 更多