按公共值组合R中的数据透视行

按公共值组合R中的数据透视行,r,R,我有一个像这样的数据框 Name Visit Arrival Departure Jack week 1 8:00 NA Jack week 1 NA 8:30 Sally week 5 9:00 NA Sally week 5 NA 9:30 Adam week 2 2:00 NA Adam week 2

我有一个像这样的数据框

Name    Visit     Arrival      Departure

Jack    week 1     8:00         NA
Jack    week 1      NA          8:30
Sally   week 5     9:00         NA
Sally   week 5      NA          9:30
Adam    week 2     2:00         NA
Adam    week 2      NA          3:00
到达和离开的时间最初是成排的,我把轴转到了柱上,这就是为什么有空的原因。我想根据姓名和访问合并行,以便到达和离开在同一行中,如

Name    Visit     Arrival      Departure

Jack    week 1     8:00         8:30
Sally   week 5     9:00         9:30
Adam    week 2     2:00         3:00

任何解决方案都将受到欢迎,在合并过程中遇到困难

这里有一种方法,假设访问的人正好有两行数据:

library(dplyr)

df = readr::read_table("Name    Visit     Arrival      Departure
Jack    week 1     8:00         NA
Jack    week 1      NA          8:30
Sally   week 5     9:00         NA
Sally   week 5      NA          9:30
Adam    week 2     2:00         NA
Adam    week 2      NA          3:00", col_types="cccc")

df %>% 
  group_by(Name, Visit) %>% 
  mutate(Arrival = ifelse(is.na(Arrival), lag(Arrival), Arrival), 
         Departure = ifelse(is.na(Departure), lead(Departure), Departure)) %>% 
  ungroup() %>% 
  distinct(Name, Visit, .keep_all=TRUE)

# A tibble: 3 × 4
   Name  Visit Arrival Departure
  <chr>  <chr>   <chr>     <chr>
1  Jack week 1    8:00      8:30
2 Sally week 5    9:00      9:30
3  Adam week 2    2:00      3:00
库(dplyr)
df=readr::read_表(“名称访问到达/离开
杰克第一周8:00北美
杰克第一周北美8:30
莎莉第5周9:00北美
莎莉第五周北美9:30
亚当2周2:00北美
Adam第2周NA 3:00”,col_types=“cccc”)
df%>%
小组成员(姓名、访问)%>%
突变(到达=ifelse(is.na(到达)、滞后(到达)、到达),
离场=如果其他情况(is.na(离场)、lead(离场)、离场))%>%
解组()%>%
不同(名称、访问、.keep_all=TRUE)
#一个tibble:3×4
姓名访问到达离开
第一周18:00 8:30
萨莉第5周9:00 9:30
第三周2:00 3:00

我相信可能有一种更漂亮的方法可以做到这一点,但这正是我所需要的:

 library(data.table)
library(reshape2)

test <- data.table(Name = c("Jack", "Jack", "Sally", "Sally", "Adam", "Adam"), Visit = c("week 1", "week 1", "week 5", "week 5", "week 2", "week 2"), Arrival = c("8:00", NA, "9:00", NA, "2:00", NA), Departure = c(NA, "8:30", NA, "9:30", NA, "3:00"))

test_m <- melt(test,id.vars = c("Name", "Visit"))
test_m <- test_m[!is.na(value),]
test_c <- dcast(test_m, Name + Visit ~ variable)

> test_c
   Name  Visit Arrival Departure
1  Adam week 2    2:00      3:00
2  Jack week 1    8:00      8:30
3 Sally week 5    9:00      9:30
库(data.table)
图书馆(E2)

测试仅
聚合
它与
na。忽略
作为聚合函数:

aggregate(dat[c("Arrival","Departure")], dat[c("Name","Visit")], FUN=na.omit)
# or
aggregate(cbind(Arrival,Departure) ~ ., data=dat, FUN=na.omit, na.action=na.pass)
#   Name Visit Arrival Departure
#1  Jack week1    8:00      8:30
#2  Adam week2    2:00      3:00
#3 Sally week5    9:00      9:30
同样的逻辑也适用于
数据。表

dat[, lapply(.SD,na.omit), by=.(Name,Visit)]
…或
dplyr

dat %>% group_by(Name,Visit) %>% summarise_all(na.omit)

实际上,如果您能够在pivot之前返回数据,那么tidyr::spread将做得非常好

Name <- c("Jack", "Jack","Sally", "Sally", "Adam", "Adam")
Visit <- c("week1", "week1", "week5", "week5", "week2", "week2")
Itenary <- rep(c("Arrival", "Departure"), 3)
Time <- c("8:00", "8:30", "9:00", "9:30", "2:00", "2:30")

df <- data.frame(Name, Visit, Itenary, Time)

df

   Name Visit   Itenary Time
1  Jack week1   Arrival 8:00
2  Jack week1 Departure 8:30
3 Sally week5   Arrival 9:00
4 Sally week5 Departure 9:30
5  Adam week2   Arrival 2:00
6  Adam week2 Departure 2:30

df %>% 
  spread(key = Itenary, value = Time)

   Name Visit Arrival Departure
1  Adam week2    2:00      2:30
2  Jack week1    8:00      8:30
3 Sally week5    9:00      9:30
名称