【问题标题】:R select and modify columns by condition in data frameR按数据框中的条件选择和修改列
【发布时间】:2018-01-18 00:46:07
【问题描述】:

我有一个大数据框架,利率结构如下

a <- "a"
b <- 2015
c <- as.vector(c(-0.3, -0.1, 0.2, 0.3, 0.5))

df <- data.frame(a,b,t(c))
colnames(df) <- c("Type", "Year", "X1", "X2", "X3", "X4", "X5")

现在我想从 X1 - X5 列的利率中减去 1,前提是该数字 > 0

我试过了

df[1,df[3:7]>0] <- df[1,df[3:7]>0] - 1 

导致

 X1   X2   X3
-1.3 -1.1 -0.8

我也看到了,那个

df[3:7]>0

结果:

X1    X2   X3   X4   X5
FALSE FALSE TRUE TRUE TRUE

我看到条件获得的列是(3,4,5),而我需要(5,6,7)。

另外,有没有一种简单的方法来复制行,以便有原始行和修改后的行?

我只是从几天前开始使用 R,非常感谢任何帮助。谢谢!

【问题讨论】:

  • 有点小技巧,但最快的方法是使用逻辑在 F = 0、T = 1 时从数字中加/减等计算的事实。 df[,3:7] - (df[,3:7] &gt; 0) 做你想做的事。否则我会使用ifelse() 声明。
  • 我默认使用 ifelse() 语句:df[1, 3:7] &lt;- sapply(df[1, 3:7], function(x) ifelse(x &gt; 0, x-1, x))。但是bmrn的版本更干净
  • 谢谢你们俩。两种方式都很完美,虽然我更喜欢 ifelse() 方式,但我会记住 bmrn 的“hack”。

标签: r dataframe


【解决方案1】:

您可以使用来自dplyr 包的mutate_atifelse

    library(tidyverse)
    df %>% mutate_at(.vars = vars(X1:X5), 
                     .funs = funs(ifelse(. > 0, . - 1, .)))

      Type Year   X1   X2   X3   X4   X5
    1    a 2015 -0.3 -0.1 -0.8 -0.7 -0.5                

编辑:更通用

    df %>% mutate_at(.vars = vars(starts_with("X")), 
                     .funs = funs(ifelse(. > 0, . - 1, .)))

    df %>% mutate_at(.vars = vars(contains("X")), 
                     .funs = funs(ifelse(. > 0, . - 1, .)))  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 2018-12-30
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多