簡體   English   中英

根據 R 中的條件,使用包含列名的字符串創建新列

[英]Create new column with string containing column names based on condition in R

我需要清理一個大數據文件(±1300 列)並將其存儲到一個邏輯數據框中。 我知道這應該是可能的,但我不知道如何。

所以我的數據只包含“是”、“否”或“不適用”值,但它們所在的列具有所有需要的信息。 這是關於您在一天中與誰共度時光。 每行是 1 名參與者。 這是一個例子:

星期一.06.00.adult1 星期一.06.00.adult2 星期一.06.00.adult3 星期一.07.00.adult1 星期一.07.00.adult2 星期一.07.00.adult3 周一 8 月 00 日成人 1 周一 8 月 00 日成人 2 周一 8 月 00 日成人 3
是的 是的 不適用 是的 是的 不適用 是的 不適用
是的 是的 是的 是的 是的

在這里,您可以扣除參與者 1 在星期一早上 6 點與成人 1 和成人 2 一起度過,並且沒有成人 3。成人 1 在 8 點離開,因為那時他的存在變為“不”。 對於參與者 2,我們看到他的早晨只從成人 1 開始,成人 2 和 3 在 8 點加入。我有整整一周每天每小時的專欄,用於與 5 個成人和 5 個孩子一起度過......我如何希望我的數據看到最后:

參與者 小時 一起度過
1個 周一 06 成人1,成人2
1個 周一 07 成人1,成人2
1個 周一 08 成人2
2個 周一 06 成人1
2個 周一 07 成人1
2個 周一 08 成人 1、成人 2、成人 3

有什么方法可以讓我選擇(每行)所有“是”的答案,然后如果它們在日期和時間重疊,則組合它們的列名? (所以對於參與者 1,“是”的答案將在 Monday.06.00.adult.1 和 Monday.06.00.adult.2 列中,我需要能夠提取並組合“Adult1”和“Adult2”以及將其存儲到單獨的列中。

我試圖從“是”的答案中收集所有列名

names(data)[which(data == "yes", arr.ind=T)[, "col"]]

但這為我提供了一個列表,在其中我看不到哪個值(列名)屬於哪個參與者,這使得無法連接正確的值。

"monday.06.00.adult.1"      "monday.06.00.adult.1"      "monday.06.00.adult.2"      "monday.06.00.adult.2"      "monday.07.00.adult.1"      "monday.07.00.adult.2"      "monday.07.00.adult.2".     "monday.07.00.child.1"      "monday.07.00.child.1"     

(這是一個隨機的例子)

我考慮過使用 dplyr(但我對它的經驗很少)。

data <- data %>% mutate(SpentWith = case_when(
if monday.07.00.adult.1 == "yes", ~ "Adult1",
if monday.07.00.adult.2 == "yes", ~ "Adult2",
if monday.07.00.adult.3 == "yes", ~ "Adult3"
))

如果滿足該條件,它將在一個字符變量中添加“Adult1”、“Adult2”、“Adult3”字符串,這將是理想的選擇。

在此過程的任何步驟中的任何幫助都會非常有幫助!

使用 dplyr 和tidyr::pivot_longer()

library(dplyr) 
library(tidyr)

data %>% 
  mutate(Participant = row_number()) %>%   # add participant IDs
  pivot_longer(                            # pivot rows to columns:
    !Participant,                                       ## all cols except Participant
    names_sep = "\\.",                                  ## break up column names by "."
    names_to = c("Day", "Hour", "Minute", "SpentWith")  ## names for new columns
  ) %>% 
  filter(value == "yes") %>%              # keep "yes" values only
  group_by(Participant, Day, Hour) %>%    # within each Participant / Day / Hour:
  summarize(                              # combine SpentWith values into one string
    SpentWith = paste(SpentWith, collapse = ", "),
    .groups = "drop"
  )
# A tibble: 6 × 4
  Participant Day    Hour  SpentWith             
        <int> <chr>  <chr> <chr>                 
1           1 Monday 06    adult1, adult2        
2           1 Monday 07    adult1, adult2        
3           1 Monday 08    adult2                
4           2 Monday 06    adult1                
5           2 Monday 07    adult1                
6           2 Monday 08    adult1, adult2, adult3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM