首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用公用值组合R中的透视行

使用公用值组合R中的透视行
EN

Stack Overflow用户
提问于 2017-03-03 06:17:14
回答 4查看 305关注 0票数 2

我有一个数据框,看起来像这样

代码语言:javascript
复制
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

到达和离开时间最初是行的,我将其转换为列,这就是为什么会有空值的原因。我想根据姓名和访问来合并行,这样到达和出发就在同一行中,如下所示

代码语言:javascript
复制
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

任何解决方案都将受到赞赏,因为在尝试合并时会遇到困难。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-03-03 06:31:27

实际上,如果您能够在pivot之前返回数据,tidyr::spread将完成一项出色的工作。

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2017-03-03 06:31:19

只需使用na.omit作为聚合函数进行aggregate即可:

代码语言:javascript
复制
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

同样的逻辑也适用于data.table

代码语言:javascript
复制
dat[, lapply(.SD,na.omit), by=.(Name,Visit)]

...or dplyr

代码语言:javascript
复制
dat %>% group_by(Name,Visit) %>% summarise_all(na.omit)
票数 5
EN

Stack Overflow用户

发布于 2017-03-03 06:26:46

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

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42567075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档