【问题标题】:R merging datasets variable duplicationR合并数据集变量重复
【发布时间】:2018-05-11 03:31:37
【问题描述】:

我已经安装了这些软件包: 投资 弦乐 蒂迪尔 数据表 plyr xml2 选择器 小标题 咕噜咕噜 数据面食 jsonlite

我在联合国粮农组织网站上搜索了一下,终于得到了这个:

FAO_AreaName <-"MEX"
news_url <- paste0("http://www.fao.org/countryprofiles/common/allnews/en/?iso3=",FAO_AreaName,"&allnews=no&limit=2")
news<- fromJSON(news_url)
title <- news[3]
date <- news[6]
FAO_AreaName_1 <- news[5]
content_MEX <- news[5]
MEX <- cbind(FAO_AreaName, FAO_AreaName_1, date,title, content_MEX)

FAO_AreaName <-"FSM"
news_url <- paste0("http://www.fao.org/countryprofiles/common/allnews/en/?iso3=",FAO_AreaName,"&allnews=no&limit=2")
news<- fromJSON(news_url)
title <- news[3]
date <- news[6]
FAO_AreaName_1 <- news[5]
content_FSM <- news[5]
FSM <- cbind(FAO_AreaName, FAO_AreaName_1, date,title, content_FSM)

当我合并两个数据集时,我得到了这个:

MERGE &lt;- merge(MEX, FSM, by="FAO_AreaName", all=T)

str(MERGE)
'data.frame':   4 obs. of  7 variables:
 $ FAO_AreaName : Factor w/ 2 levels "MEX","FSM": 1 1 2 2
 $ date_format.x: chr  "27/11/2017" "16/11/2017" NA NA
 $ title.x      : chr  "México es sede de reunión regional sobre la iniciativa de Crecimiento Azul de la FAO   " "Lograr el hambre cero pasa por reducir la pérdida y desperdicio de alimentos" NA NA
 $ bodytext.x   : chr  " \r\n\r\nLa Comisión Nacional de Acuacultura y Pesca de México es anfitriona de la principal reunión sobre la actividad en Amér"| __truncated__ " \r\n\r\nSe realiza  Foro sobre el desperdicio y pérdida de alimentos en México: retos y soluciones, organizado en el Senado de"| __truncated__ NA NA
 $ date_format.y: chr  NA NA "11/11/2017" "11/11/2017"
 $ title.y      : chr  NA NA "Pacific leaders alarmed over climate change’s negative impact on food systems and food security" "Pacific leaders alarmed over climate change’s negative impact on food systems and food security"
 $ bodytext.y   : chr  NA NA "11 November 2017, Rome – Climate change poses an alarming threat to food systems and food security in the Pacific islands, warn"| __truncated__ "11 November 2017, Rome – Climate change poses an alarming threat to food systems and food security in the Pacific islands, warn"| __truncated__

当然,我不希望 .x 和 .y 等变量重复

【问题讨论】:

  • 制作你想要的变量子集?
  • 我不想进行子集化。例如,我希望“title.x”和“title.y”只是“title”。
  • rbind 你有解决方案。详情见我的帖子。
  • 非常感谢。它工作得很好。其实我没想到rbind

标签: r variables merge duplicates dataset


【解决方案1】:

您是如此接近,甚至使用cbind 创建列表(不是数据框或数据表!)作为中间数据类型。我们将使用 rbind 并修改您构建中间数据结构的方式,以帮助您找到正确的解决方案。

步骤如下:

  1. 读入您的数据
  2. 创建中间数据表
  3. 行绑定您的数据表

读入您的数据并创建中间数据表

您的代码需要进行一项小改动。此解决方案不是使用cbind 生成列表,而是使用data.frame 生成数据框。请注意参数stringsAsFactors 设置为FALSE,以确保您的字符串类型为chr 而不是FACTOR

library(pacman)
p_load(rvest, 
       stringr, 
       tidyr,
       data.table,
       plyr,
       xml2,
       selectr,
       tibble,
       purrr,
       datapasta,
       jsonlite)

# code omitted for brevity, see original post above
MEX <- data.frame(FAO_AreaName, FAO_AreaName_1, date,title, content_MEX,
                  stringsAsFactors = F)
# code omitted for brevity, see original post above
FSM <- data.frame(FAO_AreaName, FAO_AreaName_1, date,title, content_FSM,
                  stringsAsFactors = F)

行绑定你的数据表

这个很简单。

> df <- rbind(MEX, FSM)
> dim(df)
[1] 4 5
> str(df, nchar.max = 30)
'data.frame':   4 obs. of  5 variables:
 $ FAO_AreaName: chr  "MEX" "MEX" "FSM" "FSM"
 $ bodytext    : chr  " \r\n\r\nLa C"| __truncated__ " \r\n\r\nSe r"| __truncated__ "11 November 2"| __truncated__ "11 November 2"| __truncated__
 $ date_format : chr  "27/11/2017" "16/11/2017" "11/11/2017" "11/11/2017"
 $ title       : chr  "México es sed"| __truncated__ "Lograr el ham"| __truncated__ "Pacific leade"| __truncated__ "Pacific leade"| __truncated__
 $ bodytext.1  : chr  " \r\n\r\nLa C"| __truncated__ " \r\n\r\nSe r"| __truncated__ "11 November 2"| __truncated__ "11 November 2"| __truncated__
改进建议
  • 考虑构建一个提取器函数,该函数接收 URL 和 FAO 区域名称,并输出一个包含 5 列信息的数据框。
  • 了解不同的行绑定方法。 rbind 是一,dplyr 有很多,包括bind_rows和各种类型的 加入。
  • 删除不相关的字符,例如bodytext(FAO 区域名称1)中的字符\r\n\r\nLa C 可以删除带有反斜杠的转义字符。

注意事项:

注1

有些人会遇到fromJSON 的问题,因为他们正在工作并且存在某种超时错误。如果是这种情况,请使用this workaround

# workaround in office 
download.file(news_url, destfile = "scrapedpage.html", quiet=TRUE)
news<- fromJSON("scrapedpage.html")
笔记2

由于您用于从 JSON 数据结构中提取数据的方法,您的数据具有名称。例如:

> names(date)
[1] "date_format"

如果您想覆盖这些名称,您需要稍微修改您的代码:

> MEX <- data.frame(FAO_AreaName = FAO_AreaName, FAO_AreaName_1, date,title, content_MEX,
+                   stringsAsFactors = F)
> names(MEX)
[1] "FAO_AreaName" "bodytext"     "date_format"  "title"        "bodytext.1"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 2014-08-13
    • 2021-03-06
    • 2021-02-22
    • 1970-01-01
    • 2012-06-28
    相关资源
    最近更新 更多