【问题标题】:Fill in empty values in column of dataframe by condition按条件填充数据框列中的空值
【发布时间】:2020-08-11 04:53:02
【问题描述】:

我有以下数据框。现在我想通过确定代码44和90的值来填充“产品”中的空值。44应该是“衬衫”和90“毛衣”。

最好的方法是什么?用for循环?

data = data.frame("code" = c(44,78,21,90,100,44,90), "product" = c("","hat","shoe","","umbrella","",""))
> data
  code  product
1   44         
2   78      hat
3   21     shoe
4   90         
5  100 umbrella
6   44         
7   90      

【问题讨论】:

标签: r dataframe if-statement


【解决方案1】:

您可以使用match 并使用索引进行子集化。

i <- match(data$code, c(44, 90))
j <- !is.na(i)
data$product[j] <- c("shirt", "sweater")[i[j]]
data
#  code  product
#1   44    shirt
#2   78      hat
#3   21     shoe
#4   90  sweater
#5  100 umbrella
#6   44    shirt
#7   90  sweater

【讨论】:

    【解决方案2】:

    使用dplyr首先将乘积变量转换为字符(来自因子),然后使用case_when

    library(dplyr)
    data %>% 
      mutate_if(is.factor, as.character) %>% 
      mutate(product = case_when(product == "" & code == 44 ~ "shirt",
                                 product == "" & code == 90 ~ "sweater",
                                 TRUE ~ product))
    
      code  product
    1   44    shirt
    2   78      hat
    3   21     shoe
    4   90  sweater
    5  100 umbrella
    6   44    shirt
    7   90  sweater
    

    使用base,同样的想法 - 先将因子转换为字符,然后再使用ifelse

    i <- sapply(data, is.factor)
    data[i] <- lapply(data[i], as.character)
    
    data$product[data$product == ""] <- ifelse(data$code[data$product == ""] == 44, "shirt", "sweater")
    data
      code  product
    1   44    shirt
    2   78      hat
    3   21     shoe
    4   90  sweater
    5  100 umbrella
    6   44    shirt
    7   90  sweater
    

    另外值得注意的是,如果您将data.framestringsAsFactors = FALSE 一起使用,则所有因子转换都变得不必要了。

    【讨论】:

      猜你喜欢
      • 2021-12-07
      • 2019-03-17
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      • 2020-11-19
      • 2022-01-15
      • 2020-11-29
      • 1970-01-01
      相关资源
      最近更新 更多