大家好,我正在寻找一种优雅的方式来在数据集中估算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
我可以要求任何提示吗?
答案 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>
函数。直接比较NA
或is.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