2017-03-31 120 views
0

我有這個數據幀:根據另一列中的相應值替換一列中的空單元格?

​​

,看起來像這樣:

> df 
# A tibble: 8 × 3 
number name grade 
<dbl> <chr> <chr> 
    1 dany  a 
    2 rand  b 
    3 tanya  c 
    1   
    3   c 
    4 bruce  d 
    5 tony  e 
    2      

什麼,我想是這樣的:

> df 
# A tibble: 8 × 3 
number name grade 
<dbl> <chr> <chr> 
    1 dany  a 
    2 rand  b 
    3 tanya  c 
    1 dany  a 
    3 tanya  c 
    4 bruce  d 
    5 tony  e 
    2 rand  b 

如何做到這一點? 如何用數字列對應的值替換空格?

如果可能,請解釋如何通過dplyr(tidyverse)實現此目的。

+0

列號始終是否填滿? –

+0

是的,數據集中的數字列填充在每個實例中。 – ultron

+0

是一個給定數字的第一個條目,總是完成的,如你的例子? – Craig

回答

2

這將是比較容易處理,如果你有來港,

library(dplyr) 
library(tidyr) 

df[df == ' '] <- NA 

df %>% 
group_by(number) %>% 
fill(name, grade) 

#Source: local data frame [8 x 3] 
#Groups: number [5] 

# number name grade 
# <dbl> <chr> <chr> 
#1  1 dany  a 
#2  1 dany  a 
#3  2 rand  b 
#4  2 rand  b 
#5  3 tanya  c 
#6  3 tanya  c 
#7  4 bruce  d 
#8  5 tony  e 
+0

這真棒,謝謝。 – ultron

1

這是我的解決方案假定只存在與現有的整行某處號:

library(tidyverse) 

df <- data_frame(number = c(1,2,3,1,3,4,5,2), 
       name = c('dany', 'rand', 'tanya', 
          ' ', ' ', 'bruce', 'tony', ' '), 
       grade = c('a', 'b', 'c', ' ', 'c', 'd', 'e', ' ')) 

master <- df %>% 
    filter(name != " " & grade != "") 
master <- master[!duplicated(master),] 

only_number <- df %>% 
    select(number) 

df <- inner_join(only_number, master, by = c("number")) 
1

我會做到這一點in base R使用merge

x <- df$name==" " 
A <- df[x,] 
B <- df[!x,] 
rbind(B, setNames(merge(A, B, by = "number")[,c(1,4,5)], colnames(a))) 

    # number name grade 
# 1  1 dany  a 
# 2  2 rand  b 
# 3  3 tanya  c 
# 6  4 bruce  d 
# 7  5 tony  e 
# 11  1 dany  a 
# 21  2 rand  b 
# 31  3 tanya  c 
相關問題