在R中操作数据帧而不用for循环

时间:2017-07-15 13:46:30

标签: r dataframe

我在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循环。有什么建议吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

可能的解决方案的小例子。不确定这是否是最有效的,但它可以解决问题。

# .dockerignore
* # exclude everything
!build/libs/*.jar # include just what I need in the image
  1. 如果col1 == 1,则col3 = col2 * 1.5
  2. 如果col1 == 2,则col3 = col2 * 2.5
  3. 如果col1 == 3,则col3 = col2 * 3.5
  4. 希望这有帮助。

答案 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>

1。准备你的数据:

> 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

2。使用setNames

定义键倍增器hash_map
> 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

3。只需一行代码:

> 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