缺少价值问题

时间:2014-08-24 22:28:32

标签: r missing-data imputation

我有一个包含一些缺失数据的数据集(data1.csv)(随机丢失),我正在从这个数据集(d1)创建一个子集,这样只有完整的观察结果才会保留在d2中。我使用 ftable as.data.frame 函数并创建一个代表每个组合百分比的 p 列。

 d1 = read.csv("C:/Users/....../Data1.csv",header=T)

   y x1 x2 x3
1  1  2  1 NA
2  0  2 NA  0
3  1 NA  1  1
4  0  3  1  0
5  0  2  0 NA
6  0  1  0  1
7  1 NA NA  1
8  1  3  0  1
9  1  2  0  0
10 0  3  0 NA
11 1 NA  0  1
12 1  3 NA  1
13 0  3  1 NA
14 0 NA  1  0
15 1  1  0 NA
16 0  1 NA  1
17 1 NA  0 NA
18 0  3  1  1
19 0  1 NA  0
20 0 NA  0  1

 d2= d1[complete.cases(d1),]
 d2

   y x1 x2 x3
4  0  3  1  0
6  0  1  0  1
8  1  3  0  1
9  1  2  0  0
18 0  3  1  1


 d3= ftable(d2)
 d4=as.data.frame(d3)
 d4


 y x1 x2 x3 Freq   p
 1  0  1  0  0    0 0.0
 2  1  1  0  0    0 0.0
 3  0  2  0  0    0 0.0
 4  1  2  0  0    1 0.2
 5  0  3  0  0    0 0.0
 6  1  3  0  0    0 0.0
 7  0  1  1  0    0 0.0
 8  1  1  1  0    0 0.0
 9  0  2  1  0    0 0.0
 10 1  2  1  0    0 0.0
 11 0  3  1  0    1 0.2
 12 1  3  1  0    0 0.0
 13 0  1  0  1    1 0.2
 14 1  1  0  1    0 0.0
 15 0  2  0  1    0 0.0
 16 1  2  0  1    0 0.0
 17 0  3  0  1    0 0.0
 18 1  3  0  1    1 0.2
 19 0  1  1  1    0 0.0
 20 1  1  1  1    0 0.0
 21 0  2  1  1    0 0.0
 22 1  2  1  1    0 0.0
 23 0  3  1  1    1 0.2
 24 1  3  1  1    0 0.0

函数 ftable as.data.frame 工作正常,但问题是我仍然在结果(d4)中看到所有这些观察结果有意义。当我做完完成时,我以为我摆脱了这个。(d1)

因此,需要帮助摆脱缺失值并仅为这些完整的观察结果进行频率表

   y x1 x2 x3
4  0  3  1  0
6  0  1  0  1
8  1  3  0  1
9  1  2  0  0
18 0  3  1  1

2 个答案:

答案 0 :(得分:2)

查找?complete.cases()。它会做你想要的;您可以指定缺失值以及要为其执行的列。

答案 1 :(得分:0)

这是您对输入数据进行采样

d1<-structure(list(y = c(1L, 0L, 1L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 
1L, 1L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L), x1 = c(2L, 2L, NA, 3L, 
2L, 1L, NA, 3L, 2L, 3L, NA, 3L, 3L, NA, 1L, 1L, NA, 3L, 1L, NA
), x2 = c(1L, NA, 1L, 1L, 0L, 0L, NA, 0L, 0L, 0L, 0L, NA, 1L, 
1L, 0L, NA, 0L, 1L, NA, 0L), x3 = c(NA, 0L, 1L, 0L, NA, 1L, 1L, 
1L, 0L, NA, 1L, 1L, NA, 0L, NA, 1L, NA, 1L, 0L, 1L)), .Names = c("y", 
"x1", "x2", "x3"), class = "data.frame", row.names = c("1", "2", 
"3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", 
"15", "16", "17", "18", "19", "20"))

这些命令

d2 <- d1[complete.cases(d1),]
d3 <- ftable(d2)
d4 <- as.data.frame(d3)
d4

返回下表。

   y x1 x2 x3 Freq
1  0  1  0  0    0
2  1  1  0  0    0
3  0  2  0  0    0
4  1  2  0  0    1
5  0  3  0  0    0
6  1  3  0  0    0
7  0  1  1  0    0
8  1  1  1  0    0
9  0  2  1  0    0
10 1  2  1  0    0
11 0  3  1  0    1
12 1  3  1  0    0
13 0  1  0  1    1
14 1  1  0  1    0
15 0  2  0  1    0
16 1  2  0  1    0
17 0  3  0  1    0
18 1  3  0  1    1
19 0  1  1  1    0
20 1  1  1  1    0
21 0  2  1  1    0
22 1  2  1  1    0
23 0  3  1  1    1
24 1  3  1  1    0

并不完全是原始行。这些是您完整案例中yx1x2x3的所有可能组合。如果你只想要那些实际有观察的人,你可以做

 subset(d4, Freq>0)

但这基本上会让你回到d2

4  1  2  0  0    1
11 0  3  1  0    1
13 0  1  0  1    1
18 1  3  0  1    1
23 0  3  1  1    1

似乎不清楚您的预期ftable要做什么,或者您希望结果与d2p列的来源不同。代码完全像我期望的那样工作,所以我不确定你认为结果是什么。