structure(list(
fecha = c("Fuente:La Nueva Viga, DF", "20/02/2020",
"20/02/2020", "20/02/2020", "20/02/2020", "Fuente:Monterrey, Nuevo León",
"20/02/2020", "20/02/2020", "20/02/2020", "20/02/2020", "17/02/2020",
"17/02/2020"),
producto = c("Fuente:La Nueva Viga, DF", "Aleta de raya",
"Bandera", "Besugo", "Cazón con cabeza", "Fuente:Monterrey, Nuevo León",
"Huachinango Golfo", "Pampano", "Sargo", "Trucha marina", "Huachinango Golfo",
"Pampano"), origen = c("Fuente:La Nueva Viga, DF", "Tabasco",
"Campeche", "Veracruz", "Veracruz", "Fuente:Monterrey, Nuevo León",
"Tamaulipas", "Tamaulipas", "Tamaulipas", "Tamaulipas", "Tamaulipas",
"Tamaulipas"),
pmin = c("Fuente:La Nueva Viga, DF", "23.00",
"35.00", "15.00", "60.00", "Fuente:Monterrey, Nuevo León", "165.00",
"--", "--", "--", "210.00", "--"), pmax = c("Fuente:La Nueva Viga, DF",
"27.00", "39.00", "19.00", "65.00", "Fuente:Monterrey, Nuevo León",
"200.00", "--", "--", "--", "220.00", "--"),
pfrec = c("Fuente:La Nueva Viga, DF",
"25.00", "37.00", "17.00", "63.00", "Fuente:Monterrey, Nuevo León",
"190.00", "195.00", "84.00", "98.00", "215.00", "195.00"),
obs = c("Fuente:La Nueva Viga, DF",
"", "", "", "", "Fuente:Monterrey, Nuevo León", "OBS", "OBS",
"OBS", "OBS", "OBS", "OBS"),
category = c("pescado", "pescado",
"pescado", "pescado", "pescado", "pescado", "pescado", "pescado",
"pescado", "pescado", "pescado", "pescado")),
row.names = c(2L, 3L, 4L, 5L, 6L, 341L, 342L, 343L, 344L, 345L, 346L, 347L), class = "data.frame")
上面的資料集有 6 列,但該表帶有一個子標題(例如,Fuente: La Nueva Viga, DF)。完整的資料集要大得多(> 9000 行);每個子標題下有不同數量的行。
我想轉置子標題以創建一個名為“Fuente”的新列,該列顯示“:”之后的文本。
由于data.frame中的行數和每個子標題之間的列數不一致,我不能輕易使用rep()或類似的東西(或者至少我不知道如何使用)。
我正在尋找的輸出示例如下:
fecha producto origen pmin pmax pfrec obs category Fuente
1 20/02/2020 Aleta de raya Tabasco 23.00 27.00 25.00 pescado La Nueva Viga, DF
2 20/02/2020 Bandera Campeche 35.00 39.00 37.00 pescado La Nueva Viga, DF
3 20/02/2020 Besugo Veracruz 15.00 19.00 17.00 pescado La Nueva Viga, DF
4 20/02/2020 Cazón con cabeza Veracruz 60.00 65.00 63.00 pescado La Nueva Viga, DF
5 20/02/2020 Huachinango Golfo Tamaulipas 165.00 200.00 190.00 OBS pescado Monterrey, Nuevo León
6 20/02/2020 Pampano Tamaulipas -- -- 195.00 OBS pescado Monterrey, Nuevo León
uj5u.com熱心網友回復:
這是一種可能性(假設所有子標題都以 開頭Fuente)使用tidyverse. idx在這里,我通過收集所有行直到Fuente出現在后續行中來創建一個分組列 ( )。然后,我將它們拆分為單獨的資料框并放入串列中。然后,我使用map將函式應用于該串列。我在 之后提取文本Fuente,然后將其復制到該資料框中的所有行。最后,我將資料框串列重新系結在一起。
Tidyverse
library(tidyverse)
df %>%
group_by(idx = cumsum(str_detect(fecha, "Fuente"))) %>%
group_split(., .keep = FALSE) %>%
map(., function(x)
x %>%
mutate(Fuente = sub('.*:\\s*', "", fecha)[1]) %>%
slice(-1)) %>%
bind_rows()
或者,如果您除了 之外還有其他子標題Fuente,那么您可以在 中使用“[az]” group_by(idx = cumsum(str_detect(fecha, "[a-z]")),而不是“Fuente”。
資料表
另一個選項使用data.table:
setDT(dt)[, Fuente := ifelse(grepl(':', df$fecha, fixed = TRUE),
sub('.*:\\s*', "", df$fecha), NA)]
dt[, Fuente := Fuente[nafill(replace(.I, is.na(Fuente), NA), "locf")]]
dt <- dt[!grepl("Fuente", dt$fecha),]
輸出
fecha producto origen pmin pmax pfrec obs category Fuente
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 20/02/2020 Aleta de raya Tabasco 23.00 27.00 25.00 "" pescado La Nueva Viga, DF
2 20/02/2020 Bandera Campeche 35.00 39.00 37.00 "" pescado La Nueva Viga, DF
3 20/02/2020 Besugo Veracruz 15.00 19.00 17.00 "" pescado La Nueva Viga, DF
4 20/02/2020 Cazón con cabeza Veracruz 60.00 65.00 63.00 "" pescado La Nueva Viga, DF
5 20/02/2020 Huachinango Golfo Tamaulipas 165.00 200.00 190.00 "OBS" pescado Monterrey, Nuevo León
6 20/02/2020 Pampano Tamaulipas -- -- 195.00 "OBS" pescado Monterrey, Nuevo León
7 20/02/2020 Sargo Tamaulipas -- -- 84.00 "OBS" pescado Monterrey, Nuevo León
8 20/02/2020 Trucha marina Tamaulipas -- -- 98.00 "OBS" pescado Monterrey, Nuevo León
9 17/02/2020 Huachinango Golfo Tamaulipas 210.00 220.00 215.00 "OBS" pescado Monterrey, Nuevo León
10 17/02/2020 Pampano Tamaulipas -- -- 195.00 "OBS" pescado Monterrey, Nuevo León
基準
data.table比任何tidyverse選項都快

uj5u.com熱心網友回復:
這是另一種tidyverse方法,要點是添加一個帶有add_columnfrom tibblepackage 和 data wrangling 的新列:
- 過濾所有包含的行
Fuente - 系結到原始 df 以獲得相等的列長度!
- 通過獲取長形式的 df 過濾和爭論來添加新列
!使用包含的過濾器行洗掉Fuente:
library(tidyverse)
df %>%
filter(if_any(everything(), ~str_detect(., "Fuente"))) %>%
bind_rows(df) %>%
add_column(df %>%
pivot_longer(everything(), values_to = "Fuente") %>%
filter(str_detect(Fuente, "Fuente")) %>%
mutate(Fuente = sub('.*:', '', Fuente)) %>%
select(-name)
)%>%
filter(!if_any(everything(), ~str_detect(fecha, "Fuente:")))
fecha producto origen pmin pmax pfrec obs category Fuente
1 20/02/2020 Aleta de raya Tabasco 23.00 27.00 25.00 pescado La Nueva Viga, DF
2 20/02/2020 Bandera Campeche 35.00 39.00 37.00 pescado La Nueva Viga, DF
3 20/02/2020 Besugo Veracruz 15.00 19.00 17.00 pescado La Nueva Viga, DF
4 20/02/2020 Cazón con cabeza Veracruz 60.00 65.00 63.00 pescado La Nueva Viga, DF
5 20/02/2020 Huachinango Golfo Tamaulipas 165.00 200.00 190.00 OBS pescado Monterrey, Nuevo León
6 20/02/2020 Pampano Tamaulipas -- -- 195.00 OBS pescado Monterrey, Nuevo León
7 20/02/2020 Sargo Tamaulipas -- -- 84.00 OBS pescado Monterrey, Nuevo León
8 20/02/2020 Trucha marina Tamaulipas -- -- 98.00 OBS pescado Monterrey, Nuevo León
9 17/02/2020 Huachinango Golfo Tamaulipas 210.00 220.00 215.00 OBS pescado Monterrey, Nuevo León
10 17/02/2020 Pampano Tamaulipas -- -- 195.00 OBS pescado Monterrey, Nuevo León
uj5u.com熱心網友回復:
library(tidyverse)
df %>%
mutate(grp = str_detect(string = fecha, pattern = ":"),
fuente = ifelse(grp, sub('.*:', '', fecha), NA_real_)) %>%
fill(fuente) %>%
filter(!grp) %>%
select(-grp)
#> fecha producto origen pmin pmax pfrec obs category
#> 1 20/02/2020 Aleta de raya Tabasco 23.00 27.00 25.00 pescado
#> 2 20/02/2020 Bandera Campeche 35.00 39.00 37.00 pescado
#> 3 20/02/2020 Besugo Veracruz 15.00 19.00 17.00 pescado
#> 4 20/02/2020 Cazon con cabeza Veracruz 60.00 65.00 63.00 pescado
#> 5 20/02/2020 Huachinango Golfo Tamaulipas 165.00 200.00 190.00 OBS pescado
#> 6 20/02/2020 Pampano Tamaulipas -- -- 195.00 OBS pescado
#> 7 20/02/2020 Sargo Tamaulipas -- -- 84.00 OBS pescado
#> 8 20/02/2020 Trucha marina Tamaulipas -- -- 98.00 OBS pescado
#> 9 17/02/2020 Huachinango Golfo Tamaulipas 210.00 220.00 215.00 OBS pescado
#> 10 17/02/2020 Pampano Tamaulipas -- -- 195.00 OBS pescado
#> fuente
#> 1 La Nueva Viga, DF
#> 2 La Nueva Viga, DF
#> 3 La Nueva Viga, DF
#> 4 La Nueva Viga, DF
#> 5 Monterrey, Nuevo Leon
#> 6 Monterrey, Nuevo Leon
#> 7 Monterrey, Nuevo Leon
#> 8 Monterrey, Nuevo Leon
#> 9 Monterrey, Nuevo Leon
#> 10 Monterrey, Nuevo Leon
由reprex 包于 2022-01-22 創建(v2.0.1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/419378.html
標籤:
