2

私は完全な初心者であり、誰かが今晩のほとんどの間立ち往生していて、これまでのところ、この特定の例と同様の問題の解決策をうまく適応させることができなかったマージの問題を解決してくれることを願っています.

問題を説明するために、ダミーのデータ フレームとベクトルを作成しました。

dumdata <- data.frame(id=c(1:5), pcode=c(1234,9876,4477,2734,3999), vlo=c(100,450,1000,1325,1500), vhi=c(300,950,1100,1450,1700))

id pcode  vlo  vhi
 1  1234  100  300
 2  9876  450  950
 3  4477 1000 1100
 4  2734 1325 1450
 5  3999 1500 1700


vkey <- c(105,290,513,1399,1572,1683)

vkey の値が変数 vlo と vhi の間にある場合に、dumdata のデータを含む新しいデータフレームを出力したいと考えています。実際には、vkey の値は常に vlo-vhi の範囲内にあり、範囲は常に離散的です。

目的の出力は次のようになります。

id   pcode   vlo   vhi  vkey
 1    1234   100   300   105
 1    1234   100   300   290
 2    9876   450   950   513
 4    2734  1325  1450  1399
 5    3999  1500  1700  1572
 5    3999  1500  1700  1683
4

3 に答える 3

4

ループを使用するのではなく、 を使用してforインデックス ベクトル全体を一度に作成できますsapply

ind <- sapply(vkey, function(x) which(dumdata$vlo < x & x < dumdata$vhi))
data.frame(dumdata[ind,], vkey)

    id pcode  vlo  vhi vkey
1    1  1234  100  300  105
1.1  1  1234  100  300  290
2    2  9876  450  950  513
4    4  2734 1325 1450 1399
5    5  3999 1500 1700 1572
5.1  5  3999 1500 1700 1683

ただし、 sapply の代わりに使用する必要があるため、vkey複数の行に一致する値がある場合は、より醜いものになります。dumdatalapply

data.frame(dumdata[unlist(ind),], rep(vkey, sapply(vkey, length)))

すべての一致を返すようにしますが、例からそれは起こらないと考えています。

編集:

完全を期すために、あなたも使用できることを追加しますがmapply、これは主に、複数の変数と比較する必要がある場合を対象としています (vkey1条件vkey2を一緒に満たす必要がある場合など)。

ind <- mapply(function(x, y) which(dumdata$vlo < x & y < dumdata$vhi),
              vkey1, vkey2)
于 2013-10-01T15:05:21.910 に答える
2

data.table パッケージの使用。

library(data.table)

# added a blank vkeyvalue column
dumdata <- data.table(
   id=c(1:5), 
   pcode=c(1234,9876,4477,2734,3999), 
   vlo=c(100,450,1000,1325,1500), 
   vhi=c(300,950,1100,1450,1700),
   vkeyvalue = as.integer(NA)
)

#initialising the final dataset being populated with the same structure as dumdata
finalfiltereddata <- dumdata[0]
vkey <- c(105,290,513,1399,1572,1683)

# looping throug each key
for ( i in vkey)
{
#subsetting dumdata for values which meet the condition vlo < i & vhi > i
filtereddata <- dumdata[vlo < i & vhi > i]

#assigning the filtered data the respective vkeyvalue
filtereddata[, vkeyvalue := as.integer(i)]

#appending to the master data set
finalfiltereddata <- rbind(finalfiltereddata, filtereddata)
}

finalfiltereddata

   # id pcode  vlo  vhi vkeyvalue
# 1:  1  1234  100  300       105
# 2:  1  1234  100  300       290
# 3:  2  9876  450  950       513
# 4:  4  2734 1325 1450      1399
# 5:  5  3999 1500 1700      1572
# 6:  5  3999 1500 1700      1683
于 2013-10-01T14:43:34.367 に答える
1

1 つのオプションはcut、次のように、「vkey」変数に一致する「id」列を作成するために使用することです。

cutBreaks <- sort(unlist(dumdata[c("vlo", "vhi")], use.names = FALSE))
cutLabels <- rep(1:nrow(dumdata), each = 2) * c(1, -1)

new <- data.frame(vals = vkey, id = cut(vkey, breaks = cutBreaks, 
                                        labels = cutLabels[-length(cutLabels)]))
new
#   vkey id
# 1  105  1
# 2  290  1
# 3  513  2
# 4 1399  4
# 5 1572  5
# 6 1683  5

それができたらmerge、問題なく動作するはずです:

merge(new, dumdata)
#   id vkey pcode  vlo  vhi
# 1  1  105  1234  100  300
# 2  1  290  1234  100  300
# 3  2  513  9876  450  950
# 4  4 1399  2734 1325 1450
# 5  5 1572  3999 1500 1700
# 6  5 1683  3999 1500 1700
于 2013-10-01T15:38:47.650 に答える