2017-03-02 17 views
2

結合中的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  NA   3:00 

到達和離開的時間最初的行和我樞轉到colums這就是爲什麼有所述空值的數據幀。我想合併上名的行基地,並參觀等等抵達和離開是同一行中像

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 

任何解決方案,將不勝感激,有一個艱難的時間試圖合併存在。

回答

0

其實,如果你能樞軸,tidyr之前要回的數據: :傳播將做一個美麗的工作。

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

謝謝!!!這工作完美 –

1

這裏有一個方法,假設誰訪問將會有確切的兩行數據的人:

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 
0

我敢肯定,有可能是這樣做的漂亮的方式,但是這是對我工作:

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 

希望幫助

5

只是na.omit作爲聚合函數aggregate它:

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

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

...或dplyr

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