2017-03-03 61 views
0

我嘗試過搜索某些內容但找不到它。我發現了類似的線程,但仍然沒有得到我想要的。我知道應該有一個簡單的方法來做到這一點,而不寫一個循環函數。這裏有雲與數據框中的其他列匹配列並添加匹配值的某些列

我有兩個數據幀DF1和DF2

df1 <- data.frame(ID = c("a", "b", "c", "d", "e", "f"), y = 1:6) 
df2 <- data.frame(x = c("a", "c", "g", "f"), f=c("M","T","T","M"), obj=c("F70", "F60", "F71", "F82")) 
df2$f <- as.factor(df2$f) 

現在我想匹配DF1和DF2「ID」,相互「×」欄。但是我想向df1數據框中添加新的列,它與df2中的「ID」和「x」匹配。 DF1的最終輸出應該是這樣的

ID y obj f1 f2 
    a 1 F70 M NA 
    b 2 NA NA NA 
    c 3 F60 NA T 
    d 4 NA NA NA 
    e 5 NA NA NA 
    f 6 F82 M NA 
+0

爲什麼'T'在'f2'列?列「f1」和「f2」代表什麼? –

+0

它們代表df2中的f列 – arezaie

回答

1

這是一個基本的R過程。

# combine the data.frames 
dfNew <- merge(df1, df2, by.x="ID", by.y="x", all.x=TRUE) 

# add f1 and f2 variables 
dfNew[c("f1", "f2")] <- lapply(c("M", "T"), 
           function(i) factor(ifelse(as.character(dfNew$f) == i, i, NA))) 

# remove original factor variable 
dfNew <- dfNew[-3] 
    ID y obj f1 f2 
1 a 1 F70 M <NA> 
2 b 2 <NA> <NA> <NA> 
3 c 3 F60 <NA> T 
4 d 4 <NA> <NA> <NA> 
5 e 5 <NA> <NA> <NA> 
6 f 6 F82 M <NA> 
2

我們可以tidyverse做這種連接兩個數據集和spread的「F」列

library(tidyverse) 
left_join(df1, df2, by = c(ID = "x")) %>% 
       group_by(f) %>% 
       spread(f, f) %>% 
       select(-6) %>% 
       rename(f1 = M, f2 = T) 
# A tibble: 6 × 5 
# ID  y obj  f1  f2 
#* <chr> <int> <fctr> <fctr> <fctr> 
#1  a  1 F70  M  NA 
#2  b  2  NA  NA  NA 
#3  c  3 F60  NA  T 
#4  d  4  NA  NA  NA 
#5  e  5  NA  NA  NA 
#6  f  6 F82  M  NA 

或用data.table類似的方法後,

library(data.table) 
dcast(setDT(df2)[df1, on = .(x = ID)], x+obj + y ~ f, value.var = 'f')[, -6, with = FALSE] 
相關問題