2017-10-17 51 views
1

這個問題的答案的延伸thisthis 下面是一個例子DF:用從另一載體(B)的特定值向量(A)的NA,並迫使複製的值在載體(B)到NAS

 name score end.s time 
    1 a 1 NA 1 
    2 a 2 NA 2 
    3 a 3 NA 3 
    4 b 4 4 1 
    5 b 5 4 2 
    6 b 6 4 3 
    7 c 7 NA 1 
    8 c 8 NA 2 
    9 d 6 6 1 
    10 d 7 6 3 

和輸出,我想:

 name score end.s time 
    1 a 1 3 1 
    2 a 2 3 2 
    3 a NA 3 3 
    4 b 4 4 1 
    5 b 5 4 2 
    6 b 6 4 3 
    7 c 7 8 1 
    8 c NA 8 2 
    9 d 6 6 1 
    10 d 7 6 3 

有轉變的兩個特點 - 以從「分數」列的最後一個值,以取代在NAS中的「end.s」列用NA代替'score'列中的值。

我認爲我可以使用前面的帖子中的語法來替換NA,但是一旦我看了一會兒並思考了一會兒,它就無法如此。

我在想應用函數是要走的路,但我甚至沒有設法混淆第一步。

回答

2

你想要的是一個有點複雜,所以是答案:

library(dplyr) 
df %>% group_by(name) %>% mutate(help=last(score)) %>% 
    mutate(score = ifelse(is.na(end.s), c(score[-n()], NA), score)) %>% 
    mutate_at(vars(end.s), funs(ifelse(is.na(.), help, .))) %>% select(-help) 

## # A tibble: 10 x 4 
## # Groups: name [4] 
##  name score end.s time 
## <fctr> <int> <int> <int> 
## 1  a  1  3  1 
## 2  a  2  3  2 
## 3  a NA  3  3 
## 4  b  4  4  1 
## 5  b  5  4  2 
## 6  b  6  4  3 
## 7  c  7  8  1 
## 8  c NA  8  2 
## 9  d  6  6  1 
## 10  d  7  6  3 

數據:

df <- structure(list(name = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L,  
    3L, 4L, 4L), .Label = c("a", "b", "c", "d"), class = "factor"),  
     score = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 6L, 7L), end.s = c(NA, 
     NA, NA, 4L, 4L, 4L, NA, NA, 6L, 6L), time = c(1L, 2L, 3L,   
     1L, 2L, 3L, 1L, 2L, 1L, 3L)), .Names = c("name", "score",   
    "end.s", "time"), row.names = c("1", "2", "3", "4", "5", "6",   
    "7", "8", "9", "10"), class = "data.frame") 
1

我相信以下是你想要的。

test <- do.call(rbind, lapply(split(test, test$name), function(x){ 
    i <- is.na(x$end.s) 
    x$end.s[i] <- x$score[nrow(x)] 
    if(any(i)) x$score[nrow(x)] <- NA 
    x 
})) 
row.names(test) <- NULL 
test 
1

這裏是data.table

library(data.table) 
i1 <- setDT(df)[is.na(end.s), .I[.N], name]$V1 
df[is.na(end.s), end.s := score[.N], name][i1, score := NA][] 
#  name score end.s time 
# 1: a  1  3 1 
# 2: a  2  3 2 
# 3: a NA  3 3 
# 4: b  4  4 1 
# 5: b  5  4 2 
# 6: b  6  4 3 
# 7: c  7  8 1 
# 8: c NA  8 2 
# 9: d  6  6 1 
#10: d  7  6 3 
另一種選擇
相關問題