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