2015-11-20 87 views
1

我的問題上面並不能完全解釋我所面臨的問題。 只是一個聲明 - 我非常非常新的與R,和我在自修(或者說谷歌是教我),所以道歉,如果我的問題是真的很幼稚。 我有一個家庭級別的數據,我將其轉換爲個人級別。它的長和短都是創建了很多新手。數據看起來是這樣的:我需要給的NA一列基於值的值在另一列

snapshot of data

我想用相同的代碼戶具有相同的省,區,而不是NA。數據是這樣的,因爲一個家庭中有多個人(顯然)。實際數據比這大得多。

希望得到任何幫助!我可以根據需要提供更多信息。

最佳, 阿斯瑪

+1

您應該在問題中添加數據本身而不是快照。運行'head(dataframe_object,10)'並在這裏複製輸出。 –

+3

還是更好呢:'dput(head(dataframe,10))' – sdgfsdh

+1

在我看來,這個問題是錯誤標記的。 NAs需要被每列中的數據替換,而不是來自另一列,對嗎? –

回答

1

你想要的東西,如:

dataframe$Z <- ifelse(is.na(dataframe$X), dataframe$Y, dataframe$X) 

哪裏dataframe是數據幀中的問題; X是含有一些NA值的列; Y是回退到的列;和Z是含有聚結的結果

+0

我不認爲這給出了OP正在尋找的答案。儘管問題的標註方式如何,但我認爲他們需要取代「NA」的值來自同一列,而不是另一列 - 而不是來自不同的列。 –

1

你可以試試這個方法循環列:

# in initialize a new data frame 
data2 = NULL 
codes = unique(data$hhcode) 

for(i in 1:length(codes)){ 
    # subset data by hhcode 
    data1 = data[data$hhcode == codes[i],] 

    # as long as you only have one unique region per code 
    # you can pull out the unique factor and then set all 
    # region variable for a single code 
    region = data1$region[is.na(data1$region) == F] 
    data1$region = region 

    # do the same for province 
    province = data1$province[is.na(data1$province) == F] 
    data1$province = province 

    #bind data to a new data frame 
    data2 = rbind(data2,data1) 
} 

head(data2) 
data2[1:30,] 
+0

我認爲這個答案也給了OP所尋找的東西。你也可以使用'!is.na()'而不是'is.na()== F'。最後一部分應該是'data2 [1:15,]'或者'data2',以避免打印不必要的'NA's。另外,如果數據集很大,最後的'rbind()'可能會變得很慢。 –

1

因此,作爲一個rooky你可以使用一個簡單的for循環。稍後更好地使用apply()中的sthg。

步驟1) 創建數據集。 「sdgfsdh」是正確的dput由OP的使用(頭(數據幀,10))會比較好。但爲了方便R-Rooky。 重新創建數據集:

df = data.frame(hhcode = c(rep(101010101, 5), rep(101010102, 5), rep(101010103, 5)), 
       province = c(rep(c(rep(NA, 4), "punjab"), 2), c(rep(NA, 4), "sindh")), 
       region = rep(c(rep(NA, 4), "urban"), 3)) 

2) 更換NA's。

對於每一行我們都要替換第二列和第三列。換句話說:我們想要替換每一列,除了第一列。如果我們在索引前面寫一個負號,我們可以排除列:df [,-1]。 現在我們想用a)行代替NA,這些行沒有爲「region」和「province」獲得NA,但是b)共享相同的hhcode值。

一)我們如何鑑別行,沒有獲得來港?使用na.omit(df)。 b)假設df $ hhcode存儲在一個名爲hhcode的變量中,那麼我們需要df $ hhcode等於hhcode - > df $ hhcode == hcode的行。 (注意哪個()給了我們在df $ hhcode == hcode中的「TRUE」情況的索引

最後,我們想對每個存在的唯一hhcode重複一遍,這句話中的重要詞語是: 「for」和「unique」 在你的數據集中,我可以識別出共享相同「hhcode」的組,我們可以通過df $ hhcode訪問hhcode,要獲得所有唯一的hhcode,我們使用唯一的(df $ hhcode) So我們遍歷每個獨特的元素(df $ hhcode)並替換NAs =)。

for(hhcode in unique(df$hhcode)){ 
    df[which(df$hhcode == hhcode), -1] = na.omit(df)[na.omit(df)$hhcode == hhcode, -1] 
} 
df 
+0

我認爲這個答案給出了OP正在尋找的東西。我認爲他們可能會讚賞關於代碼正在做什麼的解釋。 –

+0

好問題。如果OP以這種方式澄清,我會刪除這個答案。 – sdgfsdh

+0

這工作 - 謝謝!這一直非常有幫助。 – usmoi

0
df = data.frame(hhcode = c(rep(101010101, 5), rep(101010102, 5), rep(101010103, 5)), 
       province = c(rep(c(rep(NA, 4), "punjab"), 2), c(rep(NA, 4), "sindh")), 
       region = rep(c(rep(NA, 4), "urban"), 3)) 

首先你生成一個data.frame df_complete123唯一的完整的情況下,由前三列(無NAS)

df_complete123 <- df[!is.na(df$province) & !is.na(df$region),] 

它看起來像這樣

hhcode  province region 
101010101 punjab urban 
101010102 punjab urban 
101010103 sindh  urban 

接下來,您將使用它作爲某種查找表。第一

indices <- match(df$hhcode, df_complete123$hhcode) 

,這將給你這個

1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 

這意味着,第一列(hhcode)的df條目中找到的1,1,1,1,1,2, 2,...在df_complete123中的第 - 行。

使用此那些df_complete123的替換DF在第二值和第三列:

df$province <- df_complete123$province[indices] 
df$region <- df_complete123$region[indices] 

這導致

 hhcode province region 
1 101010101 punjab urban 
2 101010101 punjab urban 
3 101010101 punjab urban 
4 101010101 punjab urban 
5 101010101 punjab urban 
6 101010102 punjab urban 
7 101010102 punjab urban 
8 101010102 punjab urban 
9 101010102 punjab urban 
10 101010102 punjab urban 
11 101010103 sindh urban 
12 101010103 sindh urban 
13 101010103 sindh urban 
14 101010103 sindh urban 
15 101010103 sindh urban 

祝您好運!

+0

這也適用 - 謝謝!這有額外的好處,我可以使用它的數據集與額外的列,他們將保持不變(這是我想要的)。 – usmoi