我有一列包含變數串列。
用逗號分隔,有時加上“=”設定的變數的值。
見圖片。

我希望變數作為列,并在 TRUE/FALSE 或 1/0 值的列中加上如果有一個由“=”設定的值,則為該值添加一個額外的列。

我想這是一個與Pandas 將一列串列轉換為假人類似的問題,但我在 R 中需要它。
uj5u.com熱心網友回復:
由于您沒有提供明確的資料,我需要從您的螢屏截圖中重新創建一個(請在下次更新至少文本資料,這有助于重新創建您的任務)。
這些代碼塊用注釋解釋,它們使用tidyverse塊頂部包含的包中的函式。結果是您所要求的,除了列eventnumber_value被命名value_eventnumber,因為使用以數字開頭的名稱命名變數或列不是一個好習慣。
我不知道您需要這些資料做什么,但根據我的經驗,在大多數情況下,資料的寬格式不如寬格式有用。尤其是在這里,因為我預計,一個事件可能只針對一個 ID 發生。因此,dat_pivoted操作起來更方便。
library(tibble)
library(tidyr)
library(dplyr)
library(stringr)
dat <- tribble(
~post_event_list, ~date_time,
"239=20.00,200,20149,100,101,102,103,104,105,106,107,108,114,198", "2022-03-01 00:23:50",
"257,159", "2022-03-01 00:02:51",
"201,109,110,111,112", "2022-03-01 00:57:23"
)
dat_pivoted <- dat %>%
mutate(post_event_list = str_split(post_event_list, ",")) %>% # transform comma separated strings into character vectors
unnest_longer(post_event_list) %>% # split characters into separate rows
separate(post_event_list, sep = "=", into = c("var", "val"), fill = "right") %>% # separate variables from values (case of 'X=Y'), put NA as value if there is no value
mutate(val = as.numeric(val)) # treat 'val' column as numeric
dat_values <- dat_pivoted %>%
pivot_wider(id_cols = date_time, names_from = var, names_prefix = "value_", values_from = val) %>% # turn data into wide format -- make a column per each event value, present or not
select(!where(~ all(is.na(.x)))) # select only those values columns, where not every element is NA
dat_indicator <- dat_pivoted %>%
mutate(val = TRUE) %>% # each row indicates a presence of event -- change all values to TRUE
pivot_wider(id_cols = date_time, names_from = var, values_from = val, values_fill = FALSE) # pivot columns again, replacing resulting NAs witth FALSE
dat_transformed <- left_join(dat_indicator, dat_values)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/454430.html
標籤:r
上一篇:如何在R中組合兩個函式圖?
下一篇:在R中將單列拆分為多列
