[英]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.