2017-03-17 58 views
3

您好我想從一個數據幀行添加到使用R.增加價值爲R中的另一個數據幀

我有缺少了某些ID一個數據幀DATA1和數據2擁有所有的ID的另一個數據幀我想用所有匹配ID的DATA1值替換DATA2頻率列。 ,我想OUTPUT數據框作爲我的輸出。

Data1 
ID frequency 
1 1 
2 7 
3 11 
5 4 

DATA2 
ID frequency 
1 0 
2 0 
3 0 
4 0 
5 0 
6 0 

Output 
ID frequency 
1 1 
2 7 
3 11 
4 0 
5 4 
6 0 
+2

我會用'DATA2 [匹配(數據1 $ ID,DATA2 $ ID), '頻率'] < - 數據1 $ frequency' –

+0

沿着正確的線,但是這將取代'DATA2'中的值,而不是創建一個新的'Output'。 – neilfws

+0

DATA2總是隻包含零,還是可以包含其他值,您可能不想替換? – neilfws

回答

2

如果數據ID是唯一的,我認爲可以用ID是rownames。

data1 <- data.frame(
    freq = c(1, 7, 11, 4), 
    row.names = c(1, 2, 3, 5) 
) 

data2 <- data.frame(
    freq = rep(0,6), 
    row.names = seq(1, 6) 
) 
output <- data2 
apply(
    matrix(rownames(data1), ncol=1), 
    1, 
    function(x){ 
    output[x, 1] <<- data1[x, 1]; 
    return(NULL) 
    } 
) 

,其結果是:

> output 
    freq 
1 1 
2 7 
3 11 
4 0 
5 4 
6 0 
+0

謝謝你爲我工作。簡單而好:) –

+0

@RomilGarg我的榮幸。 –

1

我敢肯定有一個優雅的單線解決方案,但dplyr方法是ID然後收拾輸出加入數據幀。

library(dplyr) 
OUTPUT <- Data1 %>% 
      right_join(DATA2, by = "ID") %>% 
      mutate(frequency = ifelse(is.na(frequency.x), frequency.y, frequency.x)) %>% 
      select(ID, frequency) 
+0

不,「ifelse」是必需的。它將'frequency.x'中的'NA'值替換爲'frequency.y'中的相應值。在沒有後續步驟的情況下運行正確的連接,你就會明白爲什麼。 – neilfws

1

你可以做data.table聯接。

library(data.table) 
## set both data frames to data tables 
setDT(Data1); setDT(Data2) 
## copy 'Data2' to a new table 'Output' which we will assign values to 
Output <- copy(Data2) 
## join on 'ID' and assign by reference the relevant 'frequency' values 
Output[Data1, frequency := i.frequency, on = "ID"] 
Output 
# ID frequency 
# 1: 1   1 
# 2: 2   7 
# 3: 3  11 
# 4: 4   0 
# 5: 5   4 
# 6: 6   0 

原始數據:

Data1 <- structure(list(ID = c(1L, 2L, 3L, 5L), frequency = c(1L, 7L, 
11L, 4L)), .Names = c("ID", "frequency"), class = "data.frame", row.names = c(NA, 
-4L)) 

Data2 <- structure(list(ID = 1:6, frequency = c(0L, 0L, 0L, 0L, 0L, 0L 
)), .Names = c("ID", "frequency"), class = "data.frame", row.names = c(NA, 
-6L)) 
相關問題