如何根据类别估算数据

时间:2018-11-30 13:30:46

标签: r

大家好,我正在寻找一种优雅的方式来在数据集中估算NA:

Sex Age
M   20
M   21
F   30
M   NA
F   26
F   29
F   NA

我想为每种性别推算不同的年龄平均值。我认为女性和男性的年龄分布略有不同。不幸的是,如果不创建新的列然后再次放入数据集中,我将无法实现。即使我采用这种方式也无法正常工作,而且我认为我对问题的想法过高:

    males <- train[train[, "Sex"]=="male", ]
    females <- train[train[, "Sex"]=="female", ] 

    mf <- mean(train$Age, na.rm = TRUE)  
    mm <- mean(train$Age, na.rm = TRUE)

    train[train$Age == NA & train$Sex == "male", "Age"] <- mf 

    Error in '[<-.data.frame`(`*tmp*`, males$Age == NA & males$Sex == "male",  
    : missing values are not allowed in subscripted assignments of data frames

我可以要求任何提示吗?

2 个答案:

答案 0 :(得分:1)

要检查R中的值是否为<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="@dimen/nav_header_height" android:background="@drawable/side_nav_bar" android:gravity="bottom" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:theme="@style/ThemeOverlay.AppCompat.Dark"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingTop="@dimen/nav_header_vertical_spacing" android:text="Test" android:textAppearance="@style/TextAppearance.AppCompat.Body1" /> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Test" /> </LinearLayout> ,必须使用<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> <item name="android:statusBarColor">@android:color/transparent</item> </style> 函数。直接比较NAis.na(something)会引发错误。

something==NA

答案 1 :(得分:1)

如果您想要的是合理的值,而不是每个缺失值的平均值,则可以考虑使用软件包mice

df_old <- data.frame(Sex = c(rep("M", 500), rep("F", 500)),
                 Age = round(c(rnorm(500, 35, 2), rnorm(500, 25, 2))))

df_NA <- data.frame(Sex = sample(c("M", "F"), 10, rep = T),
                    Age = NA)

df_old %>% 
  group_by(Sex) %>%
  summarise(Mean = mean(Age))

这是男女均能使用的方法:

# A tibble: 2 x 2
  Sex    Mean
  <fct> <dbl>
1 F      24.9
2 M      34.9

现在将两个数据帧组合起来,并使用mice插值:

df <- rbind(df_old, df_NA)

library(mice)
df_imp <- complete(mice(df, m=5, maxit=50, meth='pmm', seed=500), 1)
cbind(tail(df, n = 10), tail(df_imp, n = 10))

我们使用了预测均值匹配算法来估算缺失值。还有其他几种算法(?mice)。 最后一行向您显示估算的vlaues:

       Sex Age Sex Age
1001   M  NA   M  30
1002   F  NA   F  24
1003   M  NA   M  33
1004   M  NA   M  33
1005   F  NA   F  25
1006   M  NA   M  35
1007   M  NA   M  36
1008   M  NA   M  36
1009   M  NA   M  37
1010   F  NA   F  27