簡體   English   中英

R:根據第二個data.frame中的值在d​​ata.frame中創建一個新列

[英]R: creating a new column in a data.frame based on values out of a second data.frame

我有兩個(示例)data.frames(df1,df2)

#df1
L <- LETTERS[1:4]
b <- sample(L, 20, replace = TRUE)
df1 <- data.frame(stuff1 = 1, stuff2 = 1:10, b = b, c= NA, stringsAsFactors=FALSE)

#df2
a <- c(10,20,30,40)
df2 <- data.frame(xx = L, yy = a, stringsAsFactors=FALSE )

我想基於df2的值在df1有一個新列,例如c 一個示例: A具有對應的值10(請參見df2 ),因此對於df1 b列中的每個A,在(新)行c應記下10。 而且這是df2xx每一行,因此在這種情況下是A,B,C和D。我的代碼不是真正起作用,並且僅基於單個值,這里A

##copy column b now it is c
df1["c"] <- df1$b


# which value has A in df2?
zz <- df2[df2$xx == "A",]
xy <- zz$yy


# fill in the new value in c (this is not working)
df1[df1$c == "A", ] <- xy 

我希望我想說的很清楚...哦,我有一些大數據,這只是一個嘗試的例子...

聽起來您只想進行合並/聯接。 首先,讓我們將空c放入df1並稍微更改列名稱:

 df1 <- df1[, !names(df1) %in% "c"]
 colnames(df2) <- c("b", "c")

僅使用base R,我們可以使用merge

 df3 <- merge(df1, df2, by="b", type="left")
 head(df3)

  b stuff1 stuff2  c
1 A      1      1 10
2 A      1      2 10
3 A      1      3 10
4 A      1      3 10
5 A      1     10 10
6 A      1      7 10

軟件包plyr可能有一個更快的選擇,它將保留列順序:

library(plyr)
df4 <- join(df1, df2, by="b", type="left")
head(df4)

  stuff1 stuff2 b  c
1      1      1 A 10
2      1      2 A 10
3      1      3 A 10
4      1      4 B 20
5      1      5 B 20
6      1      6 B 20

我不知道它會隨數據大小擴展的程度如何,但是如果沒有,您可以嘗試data.tablesqldf 我沒有用過這兩個,所以我不能對他們說太多,但這是對它們速度比較 ,可能是一個很好的起點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM