【问题标题】:dplyr tidyr spread error in column names and input列名和输入中的 dplyr tidyr 传播错误
【发布时间】:2016-10-14 01:16:55
【问题描述】:

我正在尝试在具有目的地和出发地名称的数据集上执行来自 tidyrspread 函数,以了解飞机旅程及其乘客人数。我尝试构建一个最终可用于热图的表格。因此,我希望将 Origin 变量放在行中,将 Destination 变量作为列。

我尝试使用不同的参数组合运行代码并使用spread_,但我总是以错误告终。

如果我将 spread_key_colval_col 一起使用,我会得到:

匹配错误(x, table, nomatch = 0L): 找不到对象“Destination.Region”

在我的大型数据集上,它会产生另一种类型的错误:

colnames<-(*tmp*, value = c("ASIA SUB-CONTINENT", "AUSTRALIA", 中的错误: 'dimnames' [2] 的长度不等于数组范围

这是我第一次使用tidyr 并且我正在了解这些软件包,这听起来并不复杂。但是我几个小时以来一直在解决这个问题,在任何论坛上都找不到任何答案。

感谢您的帮助,

以下是数据类型的示例:

data2<-matrix(NA, nrow = 7, ncol=3)  
colnames(data2)<-c("Origin.Destination", "Total.Passengers", "Destination.Region")
data2[,1] <- c("EAST AFRICA","SOUTHERN AFRICA","WEST AFRICA", "EAST AFRICA", "SOUTHERN AFRICA", "EAST AFRICA","EAST AFRICA")
data2[,2] <- c(100, 5000, 200, 10000, 200, 20, 4000)
data2[,3] <- c("WESTERN EUROPE", "SOUTH AMERICA", "ASIA", "SOUTH AMERICA", "ASIA", "WESTERN EUROPE", "WESTERN EUROPE")

data2

这是我的代码:

DF<- 
  data2 %>%
  spread_(key_ = "Destination.Region",
     value_ = "Total.Passengers", 
     convert = TRUE,
     drop = FALSE)

【问题讨论】:

  • Total.PassengersPassengers?
  • 这是我的问题中的输入错误。我刚刚纠正了它。我的代码仍然有问题。感谢您的关注。
  • 您的示例数据似乎也以其他方式错误地标记了列。你为什么不先完全修复你的例子?
  • 我明白了,我也修好了。谢谢。
  • 我无法使用您的示例数据集重现任何错误消息。我收到标准的“重复标识符”错误,如果我删除重复的标识符 spread 可以正常工作。您可能会更新您的示例以使其更像您的实际数据集,或者如果它太大而不是dput,则包含您的真实数据的结构(来自str(data2))。

标签: r layout dplyr tidyr spread


【解决方案1】:

这里有一些可以尝试的方法:

1) 我会将data2 转换为data.frame。它使使用它变得更加容易。

data2<-matrix(NA, nrow = 7, ncol=3)  
colnames(data2)<-c("Origin.Destination", "Total.Passengers", "Destination.Region")
data2[,1] <- c("EAST AFRICA","SOUTHERN AFRICA","WEST AFRICA", "EAST AFRICA", "SOUTHERN AFRICA", "EAST AFRICA","EAST AFRICA")
data2[,2] <- c(100, 5000, 200, 10000, 200, 20, 4000)
data2[,3] <- c("WESTERN EUROPE", "SOUTH AMERICA", "ASIA", "SOUTH AMERICA", "ASIA", "WESTERN EUROPE", "WESTERN EUROPE")

data3<-data.frame(data2)

2) 新的data.frame 需要一个明确的列(通常是索引列)才能使spread_ 函数正常工作。否则:

DF<- 
  data3 %>%
  spread_(key_ = "Destination.Region",
          value_ = "Total.Passengers", 
          convert = TRUE,
          drop = FALSE)

Error: Duplicate identifiers for rows (1, 6, 7)

但如果:

data3$index<-1:nrow(data3)

DF<- 
  data3 %>%
  spread_(key_ = "Destination.Region",
          value_ = "Total.Passengers", 
          convert = TRUE,
          drop = FALSE)
DF

Origin.Destination index ASIA SOUTH AMERICA WESTERN EUROPE
1         EAST AFRICA     1   NA            NA            100
2         EAST AFRICA     2   NA            NA             NA
3         EAST AFRICA     3   NA            NA             NA
4         EAST AFRICA     4   NA         10000             NA
5         EAST AFRICA     5   NA            NA             NA
6         EAST AFRICA     6   NA            NA             20
7         EAST AFRICA     7   NA            NA           4000
8     SOUTHERN AFRICA     1   NA            NA             NA
9     SOUTHERN AFRICA     2   NA          5000             NA
10    SOUTHERN AFRICA     3   NA            NA             NA
11    SOUTHERN AFRICA     4   NA            NA             NA
12    SOUTHERN AFRICA     5  200            NA             NA
13    SOUTHERN AFRICA     6   NA            NA             NA
14    SOUTHERN AFRICA     7   NA            NA             NA
15        WEST AFRICA     1   NA            NA             NA
16        WEST AFRICA     2   NA            NA             NA
17        WEST AFRICA     3  200            NA             NA
18        WEST AFRICA     4   NA            NA             NA
19        WEST AFRICA     5   NA            NA             NA
20        WEST AFRICA     6   NA            NA             NA
21        WEST AFRICA     7   NA            NA             NA

这里可能有意义的一件事是sum 按出发地和目的地的乘客总数。这将避免使用索引并防止出现如此多的 NA:

Origin <- c("EAST AFRICA","SOUTHERN AFRICA","WEST AFRICA", "EAST AFRICA", "SOUTHERN AFRICA", "EAST AFRICA","EAST AFRICA")
Passengers <- c(100, 5000, 200, 10000, 200, 20, 4000)
Destination <- c("WESTERN EUROPE", "SOUTH AMERICA", "ASIA", "SOUTH AMERICA", "ASIA", "WESTERN EUROPE", "WESTERN EUROPE")
data3<-data.frame(Origin, Passengers, Destination)

DF<-data3 %>% group_by(Origin, Destination) %>%
  summarise(Total.Passengers = sum(Passengers)) %>%
  spread(Destination, Total.Passengers)

DF

          Origin  ASIA SOUTH AMERICA WESTERN EUROPE
          (fctr) (dbl)         (dbl)          (dbl)
1     EAST AFRICA    NA         10000           4120
2 SOUTHERN AFRICA   200          5000             NA
3     WEST AFRICA   200            NA             NA

【讨论】:

  • 嗨@Bryan,确实,我正在处理数据框。但是,我不确定为什么我们需要一个索引列。我在我的数据上尝试了它和你的代码,我得到了那个错误:
  • utils::getS3method("as_data_frame", "matrix", envir = asNamespace("tibble")) 中的错误:未使用的参数 (envir = asNamespace("tibble"))
  • 需要索引是因为(参考示例数据data3)第 1、6 和 7 列都将东非作为 Origin.Destination,将西欧作为 Destination.Region。除了 Total.Passengers 之外,没有什么可以区分这些行。由于该列被用于spread,因此变得模棱两可。例如,对于东非到西欧,应该使用哪个值? 100、20 还是 4000?
  • 嗨,布莱恩,这正是我希望的结果,感谢您的解释。但是我仍然遇到(envir = asNamespace(“tibble”))的错误。我复制粘贴了您的代码并得到了错误,所以我猜问题出在我的软件中的某个地方。我安装了tibble 库并使用了不同类型的数据框,但仍然无法解决它。检查编辑是什么意思?我刚开始使用 R,还有很多东西要学!谢谢,
  • 通过检查编辑我的意思是检查我在原始帖子中添加的内容。我的代码是否适用于在我的答案中创建的示例数据集 data3?你的工作需要tibble 包吗?如果没有,请尝试在全新(重新启动的)环境中在 base data.frame 上运行代码。
猜你喜欢
  • 1970-01-01
  • 2016-05-21
  • 2020-01-19
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
  • 2017-02-05
  • 1970-01-01
  • 2017-12-09
相关资源
最近更新 更多