[英]Generating a new variable in R where the nth observation depends on the n-1th observation of another column
[英]R - Create a new variable where each observation depends on another table and other variables in the data frame
我有以下兩個表:
df <- data.frame(eth = c("A","B","B","A","C"),ZIP1 = c(1,1,2,3,5))
Inc <- data.frame(ZIP2 = c(1,2,3,4,5,6,7),A = c(56,98,43,4,90,19,59), B = c(49,10,69,30,10,4,95),C = c(69,2,59,8,17,84,30))
eth ZIP1 ZIP2 A B C
A 1 1 56 49 69
B 1 2 98 10 2
B 2 3 43 69 59
A 3 4 4 30 8
C 5 5 90 10 17
6 19 4 84
7 59 95 39
我想在df數據框中創建一個變量Inc,對於每個觀察,該值是觀察的eth和ZIP的交集。 在我的例子中,它會導致:
eth ZIP1 Inc
A 1 56
B 1 49
B 2 10
A 3 43
C 5 17
一個循環或非常強大的力量可以解決它,但我的數據集需要時間,我正在尋找一個更微妙的方式,可能使用data.table。 在我看來,這是一個非常標准的問題,我很抱歉,如果是這樣,我無法為這個問題制定一個精確的標題(你可能已經注意到了......)也許是為什么我沒有找到任何類似的問題在論壇上搜索..
謝謝 !
當然,它可以在data.table中完成:
library(data.table)
setDT(df)
df[ melt(Inc, id.var="ZIP2", variable.name="eth", value.name="Inc"),
Inc := i.Inc
, on=c(ZIP1 = "ZIP2","eth") ]
此“merge-assign”操作的語法是X[i, Xcol := expression, on=merge_cols]
。
您可以i = melt(Inc, id.var="ZIP", variable.name="eth", value.name="Inc")
運行i = melt(Inc, id.var="ZIP", variable.name="eth", value.name="Inc")
部分,看看它是如何工作的。 在合並中,來自i
列可以用i.*
前綴來引用。
交替...
setDT(df)
setDT(Inc)
df[, Inc := Inc[.(ZIP1), eth, on="ZIP2", with=FALSE], by=eth]
這是建立在類似的想法上的。 包裝暈影是開始使用這種語法的好地方。
我們可以使用row/column
索引
df$Inc <- Inc[cbind(match(df$ZIP1, Inc$ZIP2), match(df$eth, colnames(Inc)))]
df
# eth ZIP1 Inc
#1 A 1 56
#2 B 1 49
#3 B 2 10
#4 A 3 43
#5 C 5 17
那這個呢?
library(reshape2)
merge(df, melt(Inc, id="ZIP2"), by.x = c("ZIP1", "eth"), by.y = c("ZIP2", "variable"))
ZIP1 eth value
1 1 A 56
2 1 B 49
3 2 B 10
4 3 A 43
5 5 C 17
另外一個選項:
library(dplyr)
library(tidyr)
Inc %>%
gather(eth, value, -ZIP2) %>%
left_join(df, ., by = c("eth", "ZIP1" = "ZIP2"))
我的解決方案(可能看起來很尷尬)
for (i in 1:length(df$eth)) {
df$Inc[i] <- Inc[as.character(df$eth[i])][df$ZIP[i],]
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.