【问题标题】:R replace empty column of DF with random categorical valueR用随机分类值替换DF的空列
【发布时间】:2018-07-19 12:36:12
【问题描述】:

试图通过随机分配来替换人口统计值。

我可以通过执行以下操作获得空的性别数据行:

df$gender[df$gender == "",]

user_id, name, age, gender
001, xyz, 23,  
004, abc, 32, 

我想随机分配性别:

sample(c('male', 'female'), nrow(df$gender[df$gender == ""]), replace=TRUE, prob=c(0.5, 0.5))

试过以下:

df$gender[df$gender == ""] <- sample(c('male', 'female'), nrow(df$gender[df$gender == ""]), replace=TRUE, prob=c(0.5, 0.5))

这仅分配给少数单元格,但不是全部。

【问题讨论】:

  • 您应该使用length 而不是nrow,或者更好的是sum(df$gender=="",na.rm=TRUE)
  • 您可以发布示例数据吗?请使用dput(df) 的输出编辑问题。或者,如果 dput(head(df, 20)) 的输出太大。

标签: r random categorical-data


【解决方案1】:

使用下面的例子:

user_id <- c(1:5)
name <- c("a","b","c","d","e")
age <- c(20,23,44,21,32)
gender <- c("m","f","","", "m")

df <- data.frame(user_id,
                 name,
                 age,
                 gender,
                 stringsAsFactors = FALSE)

我建议创建一个长度为 nrow 的向量:

rand_gender <- sample(c('m', 'f'), nrow(df), replace=TRUE, prob=c(0.5, 0.5))

并且仅在“性别”为空的情况下替换:

df$gender <- ifelse(df$gender=="", rand_gender, df$gender)

【讨论】:

  • 这是否适用于因子列?性别列以数值结束。
  • 嗨@Null-Hypothesis,您可以使用dplyr::ifelse 处理因子列,如下所示:df$gender &lt;- dplyr::if_else(df$gender=="", as.factor(rand_gender), df$gender)
【解决方案2】:

您应该使用lengthdf$gender[df$gender == ""] 返回一个向量,因为您正在对 df$gender 进行子集化。您也不需要probs = c(0.5, 0.5),因为sample 默认使用50/50,因为您只给它两个选项。如果您希望它是男性/女性的 70/30 比例,您可以使用 probs

df$gender[df$gender == ""] <- sample(c('male', 'female'), length(df$gender[df$gender == ""]), replace=TRUE)

【讨论】:

  • Warning message: In [(*tmp*, df$gender == "", value = c(3L, 3L, : invalid factor level, NA generated 所有行都转向NA
  • 先转换成字符。 df$gender &lt;- as.character(df$gender) 那就试试吧。
猜你喜欢
  • 2018-04-03
  • 1970-01-01
  • 2021-03-26
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
相关资源
最近更新 更多