我需要根据另一列中的值为列中的NAs提供值

时间:2015-11-20 13:11:20

标签: r na

我上面的问题并没有完全解释我所面临的问题。 只是一个免责声明 - 我对R非常非常新,而且我在教自己(或者说Google教我),如果我的问题真的很天真,那么道歉。 我有一个家庭级别的数据,我将其转换为个人级别。它的长期和短期是创造了大量的NA。数据看起来像这样:

snapshot of data

我希望拥有相同代码的家庭拥有相同的省份和地区,而不是NA。数据是这样的,因为一个家庭中有不止一个人(显然)。实际数据比这大得多。

非常感谢任何帮助!我可以根据需要提供更多信息。

最佳, 阿斯马贾

4 个答案:

答案 0 :(得分:1)

你想要这样的东西:

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

dataframe是有问题的数据框架; X是包含一些NA值的列; Y是要回归的专栏; Z是包含合并结果的列

答案 1 :(得分: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,]

答案 2 :(得分:1)

所以作为一个新手你可以使用一个简单的for循环。稍后再使用apply()中的sthg。

第1步) 创建数据集。 “sdgfsdh”是正确的,OP对dput(head(dataframe,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。

对于每一行,我们要替换第二列和第三列。或者换句话说:除了第一列之外,我们想要替换每一列。如果我们在索引前写一个减号,我们可以排除列:df [, - 1]。 现在我们想用行a)替换那些不为“region”和“province”获得NA的行,而b)共享相同的hhcode值。

a)我们如何识别不获取NA的行?使用na.omit(df)。 b)假设df $ hhcode存储在一个名为hhcode的变量中,那么我们想要df $ hhcode等于hhcode的行 - &gt; df $ hhcode == hcode。 (注意哪个()给出了df $ hhcode == hcode中“TRUE”个案的索引。

最后,我们想对每个存在的唯一hhcode重复这一点。这句话中的重要词语是:“for”和“unique”。 在您的数据集中,我可以识别共享相同“hhcode”的组。我们可以通过df $ hhcode访问hhcode。要获得所有唯一的hhcode,我们使用unique(df $ hhcode)。 所以我们遍历唯一的每个元素(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

答案 3 :(得分: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,其中只包含前三列中的完整个案(无NA)

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

这意味着df中第一列(hhcode)的条目可以在df_complete123的1,1,1,1,2,2,...中找到。

你用它来用df_complete123替换df中第2和第3列的值:

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

祝你好运!