2017-05-30 82 views
0

在不同長度的數據幀進行比較的列值我敢肯定,我可以想出一個簡單的解決這個問題,但我沒有看到類似的問題,所以我想我會張貼問題。的R - 通過唯一的ID

我有成千上萬的受訪者在若干時間間隔的縱向數據集。從問題到數據類型的所有內容都可以在波浪之間有所不同,並且通常需要構建長系列的布爾值來構建指標或虛擬變量,但每個受訪者都有一個唯一的ID,沒有額外的受訪者在第一波之後添加到調查中,所以很容易足夠。

的問題是,雖然早期波由一個(塔塔)的文件中的每個,後者波含有大量的補遺文件,結構是不同的。因此,例如,在構建先前合作伙伴性別的先前指標時,存在名爲partnerNum和sex的列(對於一個wave),每個唯一ID(響應者)最多有16行。足夠簡單地傳播(或轉換)該數據,以便能夠爲每個唯一ID和列partnerNum_1 ... partnerNum_16創建一行,並將sex列中的值作爲partnerDF中的條目。然後,它很容易構建類似指標:

sexuality$newIndicator[mainDF$bioSex = "Male" & apply(partnerDF[1:16] == "Male", 1, any)] <- 1 

對於其他附錄文件中的最後兩個波數據的結構長的很像的合作伙伴的數據,爲每個獨特的ID多行,但像性,而不僅僅是一個變量我需要使用數百個測試來構建指標,所有指標都使用不同的類型進行編碼,因此將數據擴展(或施加)範圍是不切實際的(不要介意寫這些bools)。實際上,每個wave都有幾個這樣的文件,而且他們的結構方式有些受訪者(唯一ID)只佔用1行,有些是幾十個。 (我left_join'ed補遺文件是爲每個波)

我想什麼,能夠做的測試是這樣的:

newDF$indicator[any(waveIIIAdds$var1 == 1) & any(waveIIIAdds$var2 == 1)] <- 1 

newDF$indicator[mainDF$var1 == 1 & any(waveIIIAdds$var2 == 1)] <- 1 

其中newDF與mainDF的長度相同(每個唯一ID一行)。

因此,舉例來說,如果我有兩個DFS。

df1 <- data.frame(ID = c(1:4), A = rep("a")) 
df2 <- data.frame(ID = rep(1:4, each=2), B = rep(1:2, 2), stringsAsFactors = FALSE) 
df1$A[1] <- "b" 
df1$A[3] <- "b" 
df2$B[8] <- 3 

> df1 > df2 
ID A ID B 
1 b 1 1 
2 a 1 2 
3 b 2 1 
4 a 2 2 
     3 1 
     3 2 
     4 1 
     4 3 

我想測試樣(假設DF3有一列,剛剛從DF1的唯一ID)

df3$new <- 0 
df3$new[df1$ID[df1$A == "a"] & df2$ID[df2$B == 2]] <- 1 

這樣DF3將有一個唯一的ID每行,因爲有一個對所有的ID,但DF1 $ A [1]的 「a」 DF1 $ A和DF2 $ B中的至少一個行中的2對除了最後的ID的所有ID(DF2 $ B [7:8]),結果將是:

> df3 
ID new 
1 0 
2 1 
3 1 
4 0 

df3$new <- 0 
df3$new[df1$ID[df1$A == "a"] | df2$ID[df2$B == 2]] <- 1 

> df3 
ID new 
1 1 
2 1 
3 1 
4 0 

回答

0

這確實是......

df3 <- data.frame(ID=unique(df1$ID), 
        new=sapply(unique(df1$ID),function(x) 
        as.numeric(x %in% df1$ID[df1$A == "a"] & x %in% df2$ID[df2$B == 2]))) 

df3 
    ID new 
1 1 1 
2 2 1 
3 3 1 
4 4 0 
+0

這將適用於該示例,但不適用於實際數據。我可以想到一個例子,雖然這會使數據集的構建更容易!謝謝! –

0

我想出了久違的問題(而不是後的早上凌晨後一個簡約的解決方案思考了幾分鐘)。

我想要一個研究生,他可能會以這種方式構建數以千計的指標或虛擬變量,並且可能會首先學習R,甚至只能學習R,才能使用它。以下提供的實施例,並使用相同的模式實際數據的解決方案:

如果DF已經與ID和列值發起到零已經僞指示器創建爲在實施例假定

df3 <- data.frame(ID = df1$ID) 
df3$new <- 0 

我的解決辦法是:

df3$new[df1$ID %in% df1$ID[df1$A == "a"] & df1$ID %in% df2$ID[df2$B == 2]] <- 1 

> df3 
ID new 
1 0 
2 1 
3 0 
4 1 

使用| (或)代替:

df3$new[df1$ID %in% df1$ID[df1$A == "a"] | df1$ID %in% df2$ID[df2$B == 2]] <- 1 

> df3 
ID new 
1 1 
2 1 
3 0 
4 1