【问题标题】:Missing values issue缺失值问题
【发布时间】:2023-03-13 21:47:01
【问题描述】:

我有一个包含一些缺失数据(随机缺失)的数据集 (data1.csv),我正在从该数据集 (d1) 创建一个子集,以便在 d2 中仅保留完整的观察结果。我正在使用 ftableas.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

函数 ftableas.data.frame 工作正常,但问题是我仍然在结果 (d4) 中看到所有这些观察结果,这很有意义。我以为我在完成时摆脱了这个。cases(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

【问题讨论】:

  • 发行值是否可能称为 '. '(尾随空格)或其他一些语法恐怖?顺便说一句,您还可以使用na.strings 参数将一组可能的缺失值符号提交给read.csv
  • 请提供数据的一个小例子。

标签: r missing-data imputation


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这是你对输入数据的采样

    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 做什么,或者您期望结果与d2 有何不同,或者您的p 列来自哪里。代码完全按照我的预期工作,所以我不确定你认为结果会是什么。

    【讨论】:

    • 谢谢弗利克先生,看来我没有考虑到这一点,我期待 ftable 和 as.data.frame 函数只接受 4 个完整的观察,因为我已经在那里过滤了......无论如何,这现在很清楚......再次感谢。
    猜你喜欢
    • 2021-02-23
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    相关资源
    最近更新 更多