我有一个名为“行程”的数据集,其中包含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
您能帮我吗?如果有类似的问题答案,请带上链接。谢谢。
答案 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::aggregate
或dplyr
和data.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中,这是一个不好的方法。 aggregate
,dplyr
或data.table
更好。