簡體   English   中英

根據條件對R中的多列進行突變

[英]Mutate multiple columns in R based on conditions

這可能是我正在做的愚蠢的事情,但是我試圖根據某些列的值是否包含值將它們連接在一起,然后創建兩個新列,分別稱為start.week和end.week。

我的起始周是“星期一,星期二和星期三”。 end.week是“星期四和星期五”。

 Name        Monday Tuesday Wednesday   Thursday    Friday
 John        Red            Pink        
 Francis     Blue   Gray                 Black  
 Bill        Green          Orange       Purple 
 Bob         Yellow                      Lilac      Magenta

我可以使用星期四和星期五將這兩列加在一起:

start.week = c("Monday", "Tuesday", "Wednesday")
end.week = c("Thursday", "Friday")

options(stringsAsFactors = FALSE)
df = mutate(df, end.week = ifelse(Friday != "", paste0(Thursday, " + ", Friday), Thursday))

返回我無法解決如何開始這個星期

誰能給我一個提示嗎? 我將永遠感激不已

原始數據:

df = structure(list(Name = c("John", "Francis", "Bill", "Bob"), Monday = 
c("Red", "Blue", "Green", "Yellow"), Tuesday = c("", "Gray", "", ""), 
Wednesday = c("Pink", "", "Orange", ""), Thursday = c("", 
"Black", "Purple", "Lilac"), Friday = c("", "", "", "Magenta"
)), class = "data.frame", row.names = c(NA, -4L))

預期產量:

 df = structure(list(Name = c("John", "Francis", "Bill", "Bob"), Monday = 
 c("Red", "Blue", "Green", "Yellow"), Tuesday = c("", "Gray", "", ""), 
Wednesday = c("Pink", "", "Orange", ""), Thursday = c("", 
"Black", "Purple", "Lilac"), Friday = c("", "", "", "Magenta"
), start.week = c("Red + Pink", "Black", "Green + Orange", 
"Yellow"), end.week = c("", "", "Purple", "Lilac + Magenta"
)), class = "data.frame", row.names = c(NA, -4L))

這樣的事情怎么樣?

library(tidyverse)
df %>%
    gather(key, val, -Name) %>%
    group_by(Name) %>%
    mutate(
        start.week = paste(val[key %in% start.week & val != ""], collapse = " + "),
        end.week = paste(val[key %in% end.week & val != ""], collapse = " + ")) %>%
    spread(key, val)
## A tibble: 4 x 8
## Groups:   Name [4]
#  Name    start.week     end.week      Friday Monday Thursday Tuesday Wednesday
#  <chr>   <chr>          <chr>         <chr>  <chr>  <chr>    <chr>   <chr>
#1 Bill    Green + Orange Purple        ""     Green  Purple   ""      Orange
#2 Bob     Yellow         Lilac + Mage… Magen… Yellow Lilac    ""      ""
#3 Francis Blue + Gray    Black         ""     Blue   Black    Gray    ""
#4 John    Red + Pink     ""            ""     Red    ""       ""      Pink

想法是將數據從寬轉換為長,添加新列start.weekend.week ,然后將數據轉換回寬。

或者我們可以使用purrr::imap_dfc在某種程度上自動生成新列; 為此,我們需要將新列存儲在命名list

lst <- list(start.week = start.week, end.week = end.week)
df %>%
    gather(key, val, -Name) %>%
    group_by(Name) %>%
    mutate(
        tmp = list(imap_dfc(lst, ~paste(val[key %in% .x & val != ""], collapse = "+")))) %>%
    unnest() %>%
    spread(key, val)

請注意,我認為您的預期輸出有誤; Francis start.week應該是Blue + Gray而不是Black

暫無
暫無

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

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