如何使用for循环在两列中划分观察?

时间:2016-11-05 11:36:53

标签: r

我正在使用MacBook;我正在运行最新版本的R。

我是R.的新手。

我有一个加载到变量数据中的数据框。

                   mpg cyl disp  hp drat
Mazda RX4         21.0   6  160 110 3.90
Mazda RX4 Wag     21.0   6  160 110 3.90
Datsun 710        22.8   4  108  93 3.85
Hornet 4 Drive    21.4   6  258 110 3.08
Hornet Sportabout 18.7   8  360 175 3.15
Valiant           18.1   6  225 105 2.76
                     wt  qsec vs am gear
Mazda RX4         2.620 16.46  0  1    4
Mazda RX4 Wag     2.875 17.02  0  1    4
Datsun 710        2.320 18.61  1  1    4
Hornet 4 Drive    3.215 19.44  1  0    3
Hornet Sportabout 3.440 17.02  0  0    3
Valiant           3.460 20.22  1  0    3
                  carb
Mazda RX4            4
Mazda RX4 Wag        4
Datsun 710           1
Hornet 4 Drive       1
Hornet Sportabout    2
Valiant              1

我有一项任务,需要创建一个包含“hp”除以“wt”的向量。必须使用for循环完成。这是我能够达到的目的。

> hp_wt <-c(for(i, data) {hp/wt})
Error: unexpected ',' in "hp_wt <-c(for(i,"
> f<- for (i in data) {data$hp/data$wt}
> f
NULL
> for (i in data) {data$hp/data$wt}
> f<- c(for (i in data) {data$hp/data$wt})
> f
NULL

非常感谢任何帮助。

谢谢,

3 个答案:

答案 0 :(得分:1)

R data.frames中的列可以像这样轻松划分:

data$hp / data$wt

此外,您可以将结果向量分配给新列:

data$hp_wt <- data$hp / data$wt

因此,您不需要遍历所有行。

答案 1 :(得分:0)

Loki的方式是在实践中解决问题的正确方法。

但如果你真的坚持使用for循环,那么:

powerToWeight <- NULL
temp <- NULL
# for each row in the dataset
for (i in 1:nrow(data))
{
    # calculate hp/wt ratio for a given observation
    temp <- as.numeric(data[i, "hp"])/as.numeric(data[i, "wt"])
    # attach the ratio to previously calculated values
    powerToWeight <- c(powerToWeight, temp)
}

# attach the calculated vector to the original dataset
data$hpToWt <- powerToWeight

......是其中一种方法。

答案 2 :(得分:0)

虽然我非常同意@loki你不需要在R中编写一个where y_id = any (values (1625, 1871, ..., 1640, 1643, 13291, 1458, 13304, 1407, 1765) ) 循环来划分数据帧的两个向量或列,但OP明确要求使用{ {1}}循环。所以,这是一个:

for

然而,以下基准测试显示这不是一个非常好的主意w.r.t.性能:

for

R中的hp_wt <- numeric(0) for (i in seq.int(nrow(data))) { hp_wt[i] <- with(data[i, ], hp / wt) } 循环比矢量计算慢约40倍。