![](/img/trans.png)
[英]Multiply column values in one data.frame by column in another data.frame on a condition in R
[英]Using data in one data.frame to generate values for a new column in another data.frame in R
我有兩個數據框,其中一個包含時間戳和air_temperature
air_temp time_stamp
85.1 1396335600
85.4 1396335860
另一個包含startTime,endTime,位置坐標和規范名稱。
startTime endTime location.lat location.lon name
1396334278 1396374621 37.77638 -122.4176 Work
1396375256 1396376369 37.78391 -122.4054 Work
對於第一個數據幀中的每一行,我想確定它位於第二個數據幀中的哪個時間范圍,即,如果時間戳1396335600在startTime 1396334278和endTime 1396374621之間,則將位置和名稱值添加到該行中在第一個data.frame中。
第二個數據幀中的開始時間和結束時間不重疊,並且線性增加。 但是它們不是完全連續的,因此,如果時間戳介於兩個時間段之間,則需要將該位置標記為NA。 如果它確實適合開始時間和結束時間之間,我想將location.lat,location.lon和name列添加到第一個數據幀。
感謝您的幫助。
嘗試這個。 未經測試。
newdata <- data2[data1$timestamp>=data2$startTime & data1$timestamp<=data2$endTime ,3:5]
data1 <- cbind(data1[data1$timestamp>=data2$startTime & data1$timestamp<=data2$endTime,],newdata)
如果時間戳不在startTime和endTime之間,則此方法將不返回任何值,因此從理論上講,您返回的數據集可能比原始數據集短。 以防萬一我用與data2相同的TRUE FALSE向量處理data1,所以它們的長度相同。
rowidx <- sapply(dfrm1$time_stamp, function(x) which( dfrm2$startTime <= x & dfrm2$endTime >= x)
cbind(dfrm1$time_stamp. dfrm2[ rwoidx, c("location.lat","location.lon","name")]
我的也沒有進行測試,並且看上去與CCurtis基本相似,因此請給他檢查是否可行。
有趣的問題……原來比我原先想象的還要復雜!! 第一步:設置數據!
DF1 <- read.table(text="air_temp time_stamp
85.1 1396335600
85.4 1396335860",header=TRUE)
DF2 <- read.table(text="startTime endTime location.lat location.lon name
1396334278 1396374621 37.77638 -122.4176 Work
1396375256 1396376369 37.78391 -122.4054 Work",header=TRUE)
步驟2:對於DF1
每個time_stamp
,在DF2
計算適當的index
:
index <- sapply(DF1$time_stamp,
function(i) {
dec <- which(i >= DF2$startTime & i <= DF2$endTime)
ifelse(length(dec) == 0, NA, dec)
}
)
index
第三步:合並兩個數據幀:
DF1 <- cbind(DF1,DF2[index,3:5])
row.names(DF1) <- 1:nrow(DF1)
DF1
希望這可以幫助!!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.