【问题标题】:R , Looping through a dataframe , creating a new one with additional contentR,循环通过数据框,创建一个具有附加内容的新数据框
【发布时间】:2020-11-12 14:05:50
【问题描述】:

注意,对 R 来说很新 - 但我真的很想在 R 而不是 java 中执行此操作。

我的 csv 文件(2020 年瑞典物种红名单)如下所示:

id,svenskt,latin,Organismgrupp,Kategori,Observationer,Landskapstyp,status_abbrev,Rodlistekriterium
249012,,Abia candens,stekel,Art,3,"Jordbrukslandskap (J) - Stor betydelse, Skog (S) - Har betydelse",DD,
249014,,Abia lonicerae,stekel,Art,2,Skog (S) - Stor betydelse,DD,
261452,,Abia nitens,stekel,Art,0,Jordbrukslandskap (J) - Stor betydelse,DD,
  • 可以通过点击“skapa csv-fil”按钮从SLU 下载整个 csv 文件。

对我来说有趣的列只有“id”和“status_abbrev”列。 我想使用这些列来更新我的数据库表,做这样的事情:

sql<- paste("update redlist SET status_abbrev='",abbrev,"' ","where id=",id,sep="")

使用此命令读取 csv 文件:

library(dplyr)
redlist <- read.csv("rodlistade_arter_tampered_2.csv",header=TRUE);
dat <- select(redlist,'id', 'status_abbrev')

前 3 行的输出将是:

  1. redlist 是一个数据框,包含带有标题的 csv。
  2. dat是一个数据框,包含红名单的一个子集(id 和 status_abbrev)。

但是哪个库最适合遍历“dat”数据框以创建类似的东西? 迭代并挑选 abbrev 和 id 并为每一行 创建以下字符串 - (最后我想将这些字符串写入 sql-batch 文件并更新粗糙的 5660 记录)

sql<- paste("update redlist SET status_abbrev='",abbrev,"' ","where id=",id,sep="")

所以我的结果字符串会是这样的(然后遍历整个文件):

update redlist SET status_abbrev=DD where id=249012

screenshot of redlist 和 dat -

最好的,我

【问题讨论】:

  • 我不明白你的问题,但你所拥有的,基本上就是要这样做......在R中一切都是向量,所以你不必使用循环来做同样的操作在每一行。
  • 你能举一个前三行输出的例子吗?
  • 您是否在询问使用哪个库来更新数据库记录?如果是这样,这在 SO 上是题外话。
  • @RonakShah,不,事实并非如此——如果你通读我的问题,我想创建一个字符串——在 java 中做类似的事情很容易
  • @Elin ,那么我该如何创建这个字符串 -> 更新 redlist SET status_abbrev=DD where id=249012 ,然后对我的 redlist 中的所有 id 重复此操作?

标签: r csv dplyr tidyverse


【解决方案1】:

使用dplyr::mutate()glue::glue() 你可以创建这样的字符串

library(tidyverse)
library(glue)
#> 
#> Attaching package: 'glue'
#> The following object is masked from 'package:dplyr':
#> 
#>     collapse

str <- 'id,svenskt,latin,Organismgrupp,Kategori,Observationer,Landskapstyp,status_abbrev,Rodlistekriterium
249012,,Abia candens,stekel,Art,3,"Jordbrukslandskap (J) - Stor betydelse, Skog (S) - Har betydelse",DD,
249014,,Abia lonicerae,stekel,Art,2,Skog (S) - Stor betydelse,DD,
261452,,Abia nitens,stekel,Art,0,Jordbrukslandskap (J) - Stor betydelse,DD,'

df <- read_csv(str)

df2 <- df %>% 
  mutate(sql_string = glue("update redlist SET status_abbrev='{status_abbrev}' where id={id}"))

df2
#> # A tibble: 3 x 10
#>       id svenskt latin Organismgrupp Kategori Observationer Landskapstyp
#>    <dbl> <lgl>   <chr> <chr>         <chr>            <dbl> <chr>       
#> 1 249012 NA      Abia… stekel        Art                  3 Jordbruksla…
#> 2 249014 NA      Abia… stekel        Art                  2 Skog (S) - …
#> 3 261452 NA      Abia… stekel        Art                  0 Jordbruksla…
#> # … with 3 more variables: status_abbrev <chr>, Rodlistekriterium <lgl>,
#> #   sql_string <glue>

df2 %>% pull(sql_string)
#> update redlist SET status_abbrev='DD' where id=249012
#> update redlist SET status_abbrev='DD' where id=249014
#> update redlist SET status_abbrev='DD' where id=261452

reprex package (v0.3.0) 于 2020 年 7 月 27 日创建

这是你要找的吗?

关于数据库集成,请查看DBI

【讨论】:

  • 谢谢!这就是我所追求的,我想我可以通过逐行保存到文件(例如 .update_redlist.sql )来解决剩下的问题 - 我发现这个免费课程(learn.datacamp.com/courses/introduction-to-the-tidyverse)猜想可能是一个开始。
  • 我想知道“胶水”功能中的条件。
  • 我想知道 'glue' 函数中的条件,根据 {status_abbrev}-field 中的结果添加一个 'if-else' 语句。我使用 5 个缩写 {'EX', 'NT', 'LC','DD','NE'} 并且我的表有 2 个附加字段(英语和瑞典语)用于将它们写出来(其中 EX 翻译为“灭绝” & 'Utdöd' , NT 至 '近危' & 'Nära hotad', LC 至'最不关心' & 'Livskraftig', DD 至'数据不足' & 'Kunskapsbrist', NE 至'未评估' & 'Ej bedömd'
  • 为什么要逐行保存到文件中而不是像write.csv 这样的操作?
  • {} 中的代码是有效的 r 代码,因此可以这样工作:glue("{ifelse(x==0, 'x is zero', 'x is not zero'}")
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多