如何用nrow编写for in for循环?

时间:2019-05-24 00:02:24

标签: r

我有一个名为“行程”的数据集,其中包含900,000条记录,显示行程。我有一列“ ID”,其中显示了个人的人ID。但是,这就是重点。一个人可能有1次旅行,因此该ID只有一条记录,但另一个人可能有7条旅行,因此有7行(具有相同的ID)。然后,我有一列称为“运输模式”,其值可以为1(对于汽车),2(对于公共交通),3(对于步行)和4(对于自行车),显示不同的运输选项。这是我的变量:

ID:c(30001、30002、30002、30002、30002、30002、30002、30002)

然后,我有一个名为Transport_mode的列,与该ID(行程)有关

Transport_mode:c(1、2、4、3、2、1、2、1)

因此,我创建了一个名为“ public_fr”的空变量,以显示公共交通出行的频率。我想编写一个for循环,该循环计算任何ID的公共传输模式的数量。因此,我尝试了以下方法:

for (i in 1:nrow(trip))
   {for (j in 1:nrow(trip$ID))
     {if (as.character(trip$Transport_mode[j] == 2)) (trip$public_fr[j] <- trip$public_fr[j] + 1)}

这段代码应该给我:

public_fr:c(0,3)

0:因为ID = 30001没有公共交通旅行(请参阅运输方式1),而3:因为ID = 30002没有3次公共交通旅行(因为有3个2s),但是它不起作用。它给出以下错误:

1:nrow(trip $ ID)错误:参数长度为0

您能帮我吗?如果有类似的问题答案,请带上链接。谢谢。

3 个答案:

答案 0 :(得分:2)

您可以使用aggregate在基数R中执行此操作。

aggregate(trip$Transport_mode == 2, list(trip$ID), sum)$x
[1] 0 3

答案 1 :(得分:1)

如果结尾处的注释中的代码给出了trip,那么这将给出ID与模式计数的表格:

table(trip)

给予:

       Transport_mode
ID      1 2 3 4
  30001 1 0 0 0
  30002 1 3 1 1

注意

trip <- data.frame(
  ID = c(30001, 30002, 30002, 30002, 30002, 30002, 30002),
  Transport_mode = c(1, 2, 4, 3, 2, 1, 2))

答案 2 :(得分:0)

您的错误是因为trip$ID只是一个向量,并且向量没有行。 nrow(trip$ID)将给出NULL,而1:NULL将给出您看到的错误。

更一般而言,for循环是执行此操作的不好方法。例如,有许多好的方法可以按数据帧base::aggregatedplyrdata.table包“按组”进行操作。这是您的代码的dplyr版本:

library(dplyr)
trip %>%
  group_by(ID) %>%
  summarize(public_fr = sum(Transport_mode == 2))

通常,sum(condition)是一种计算满足条件次数的好方法,例如sum(Transport_mode == 2)

如果您真的要使用for循环(您不应该-很难写,也要慢得多),则应该循环使用唯一的ID值,而不是在每一行上:

uid = unique(trip$ID)
public_fr = integer(length(uid))
for(i in 1:length(uid)) {
  public_fr[i] = sum(trip[trip$ID == uid[i], "Transport_mode"] == 2)
}

上面的循环查看每个唯一的ID,提取与该ID对应的Transport_mode值,并使用sum技巧来计数2s。但是在R中,这是一个不好的方法。 aggregatedplyrdata.table更好。