我在R中有一个数据框,其中包含3列和数百万行:
> df
col1 col2 col3
1 one 1.1 4
2 two 1.5 1
3 three 1.7 5
. .. .. ..
我想根据其中两列进行计算。我想创建一个基本上类似于:
的列if col1 == "one", then result = col2*.0.5,
else if col1 == "two, then result = col2*0.6
else if ...
但是没有在数百万行上做一个非常大的for循环,我想不出更多的“R”方式来做这个没有for循环。有什么建议吗?
谢谢!
答案 0 :(得分:1)
可能的解决方案的小例子。不确定这是否是最有效的,但它可以解决问题。
# .dockerignore
* # exclude everything
!build/libs/*.jar # include just what I need in the image
希望这有帮助。
答案 1 :(得分:1)
矢量化方式可能如下。
# make up some data
set.seed(525)
col1 <- sample(c("one", "two", "three"), 20, TRUE)
col2 <- runif(20)
col3 <- rnorm(20)
dat <- data.frame(col1, col2, col3, stringsAsFactors = FALSE)
# where to hold the result
result <- numeric(nrow(dat))
# first condition
inx <- dat$col1 == "one"
result[inx] <- dat[inx, "col2"]*0.5
# second condition
inx <- dat$col1 == "two"
result[inx] <- dat[inx, "col2"]*0.6
result
答案 2 :(得分:1)
我会个人使用密钥乘数 hash_map ,因为没有人想编写许多 if-else 语句,请查看此演示:< / p>
> c1 <- c("one", "two", "three")
> c2 <- sample(10, 3)
> df <- data.frame(c1, c2)
> df$c1 <- as.character(df$c1)
> df
c1 c2
1 one 4
2 two 10
3 three 5
setNames
:> key <- c("one", "two", "three")
> multiplier <- c(0.5, 0.6, 0.7)
> my.multiplier <- setNames(as.list(multiplier), key)
> my.multiplier
$one
[1] 0.5
$two
[1] 0.6
$three
[1] 0.7
> df$c3 <- df$c2 * as.numeric(my.multiplier[df$c1])
> df
c1 c2 c3
1 one 4 2.0 #4 * 0.5
2 two 10 6.0 #10 * 0.6
3 three 5 3.5 #5 * 0.7