【发布时间】: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] > 0)做你想做的事。否则我会使用ifelse()声明。 -
我默认使用 ifelse() 语句:
df[1, 3:7] <- sapply(df[1, 3:7], function(x) ifelse(x > 0, x-1, x))。但是bmrn的版本更干净 -
谢谢你们俩。两种方式都很完美,虽然我更喜欢 ifelse() 方式,但我会记住 bmrn 的“hack”。