首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用nrow编写一个for in for循环?

如何使用nrow编写一个for in for循环?
EN

Stack Overflow用户
提问于 2019-05-24 08:02:24
回答 3查看 324关注 0票数 0

我有一个名为"trip“的数据集,其中包括900,000条记录,其中显示了行程。我有一个名为" ID“的列,它显示了个人的个人ID。然而,这里就是重点。一个人可能有一次旅行,因此该ID只有一条记录,但另一个人可能有7次旅行,结果是7行(具有相同的ID)。然后,我有一个名为"transport mode“的列,它的值可以是1(用于汽车)、2(用于公共交通)、3(用于步行)和4(用于自行车),以显示不同的交通选项。以下是我的变量:

ID: c(30001,30002,30002,30002,30002,30002,30002,30002)

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

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

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

代码语言:javascript
运行
复制
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有三次公共交通行程(因为有三个2).However,所以它不起作用。它会给出以下错误:

1中出错:nrow(trip$ID):长度为0的参数

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

EN

回答 3

Stack Overflow用户

发布于 2019-05-24 08:12:49

您可以在base R中使用aggregate完成此操作。

代码语言:javascript
运行
复制
aggregate(trip$Transport_mode == 2, list(trip$ID), sum)$x
[1] 0 3
票数 2
EN

Stack Overflow用户

发布于 2019-05-24 08:16:07

如果trip是由末尾注释中的代码给出的,那么这将给出一个ID与模式的计数表:

代码语言:javascript
运行
复制
table(trip)

给予:

代码语言:javascript
运行
复制
       Transport_mode
ID      1 2 3 4
  30001 1 0 0 0
  30002 1 3 1 1

备注

代码语言:javascript
运行
复制
trip <- data.frame(
  ID = c(30001, 30002, 30002, 30002, 30002, 30002, 30002),
  Transport_mode = c(1, 2, 4, 3, 2, 1, 2))
票数 1
EN

Stack Overflow用户

发布于 2019-05-24 08:11:48

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

更广泛地说,for循环不是这样做的好方法。例如,在数据框、base::aggregatedplyrdata.table包中,有许多“按组”执行操作的好方法。以下是您的代码的dplyr版本:

代码语言:javascript
运行
复制
library(dplyr)
trip %>%
  group_by(ID) %>%
  summarize(public_fr = sum(Transport_mode == 2))

通常,sum(condition)是计算满足条件的次数的好方法,就像本例中的sum(Transport_mode == 2)一样。

如果你真的想使用for循环(你不应该-它更难写,也更慢),你应该遍历唯一的ID值,而不是每一行:

代码语言:javascript
运行
复制
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技巧计算2。但在R中,这是一种糟糕的方式。aggregatedplyrdata.table要好得多。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56284286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档