假設我有一個帶有銷售額的資料集:
library(tidyverse)
initial_data <- tribble()
~ billing_loc, ~ types, ~ billing_comment, ~ billing_comment,
"New York", "RE"。 "aaa ssss 003tt", "aaa ssss 003tt",
"London", "ZO", "BO", "BO" ,
"Paris", "ZO", "003sd, 003Wf; 003ghdiscount"
)
首先,我想提取在billing_comment列中提供的所有專案id。一個專案ID總是以 "003 "開頭,長度為5。我使用了以下代碼:
modified_data <- initial_data %>%
mutate(project_id = str_extract_all(billing_comment, "003。 。"))
其次,我想使用left_join從第二個表中查找有關id的資訊,并將其插入到串列列中:
project_id_database <- tribble()
~ project_id, ~ type, ~ owner, ~ owner,
"003tt", "ZO"。 "Juan",
"003sd",/span> "ZO"。 "Mike",
"003aA", "RE"。 "Brent", "Brent",
"003Wf", "ZO"。 "Brent", "Brent",
"003gh", "RE"。 "Anna", "Anna",
"003qQ", "ZO", "Donald"
)
是否有辦法對嵌套的資料使用left_join而不進行嵌套,并得到一個包含有這些id所有資訊的tibbles的串列列(不要被第二行的<gl [1]所迷惑,它可以回傳NA或一些字串,說id丟失)?
billing_loc type billing_comment project_data
<chr> <chr> < chr> <list>/span>
1 New York RE aaaa ssss 003tt < tibble [1 x 3] >/span>
2 London ZO BO < lgl [1]/span>>
3 巴黎ZO 003sd, 003Wf; 003ghdiscount < tibble [3 x 3] >/span>
我找到了一個用unnest()的方法,然后使用left_join,但我認為應該有一個更有效的解決方案。
最后,如果有一個解決方案來添加一個只有一個id的列,并與 "型別 "列中的標準相匹配,那就更好了(如果有幾個id與標準相匹配,應該回傳第一個)。為此,我使用了map(),但我也認為這種方式不那么有效,因為我為此使用了 "status "列:
test_data_nest %>%
mutate(final_project =map(data, ~ filter(. , 狀態== "匹配")) %> %
mutate(final_project =map(final_opp, 1))
uj5u.com熱心網友回復:
我認為分離行,提取project_ids,附加細節,嵌套,然后再連接回來,會比嘗試map更簡單和快速:
initial_data %> %
separate_rows(billing_comment) %>%
mutate(project_id = str_extract(billing_comment, "003。 。")) %>%
inner_join(project_id_database %> % select(-type)。 by="project_id") %> %
group_by(billing_loc, type) %>%
nest() %>%
right_join(initial_data, by=c("billing_loc"/span>。 "type"))
## A tibble: 3 x 4
## Groups: billing_loc, type [3]
# billing_loc type data billing_comment
# <chr> <chr> <list> <chr>
#1 New York RE <tibble [1 x 3]> aaaa ssss 003tt
#2 巴黎ZO <tibble [3 x 3]> 003sd, 003Wf; 003ghdiscount
#3 London ZO <NULL> BO
uj5u.com熱心網友回復:
如果你想在不對長格式的資料進行嵌套的情況下做到這一點,你可以使用 -
library(tidyverse)
initial_data %>%。
mutate(project_id = str_extract_all(billing_comment, "003。 。"),
資料 = map(project_id,)
~project_id_database[match(. x, project_id_database$project_id)。 ]))
# A tibble: 3 x 5
# billing_loc type billing_comment project_id data
# <chr> <chr> <chr> <list>
#1 New York RE aaaa ssss 003tt <chr [1]> <tibble [1 × 3]>
#2 London ZO BO <chr [0]> <tibble [0×3]>
#3 巴黎 ZO 003sd, 003Wf; 003ghdiscount <chr [3]> <tibble [3 × 3]>
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/306866.html
標籤:
上一篇:如何在R中為一個函式添加紅線
