【问题标题】:Iterations with Loops and Functions循环和函数的迭代
【发布时间】:2019-12-24 14:15:49
【问题描述】:

我想运行一个循环来读取数据帧 (data_rais) 中的值,但我意识到这可能需要几天时间,我认为这是因为我正在运行一个循环,而不是一个函数。 我多次尝试编写一个与此循环相同的函数,但我找不到这样做的方法。 我的问题是:是否可以在函数中转换此循环?怎么样?

   for(i in 1:nrow(data_rais)){
  if(is.na(data_rais$postal_code[i])){
    next()
  } else {
    data_rais$munic_name[i] = munics_code[row(munics_code)[which(munics_code$cods == data_rais$munic[i])], 1]
  }
}

munics_code 看起来像这样:

  munics_code = tibble::tribble(
    ~municipio,~cods,
    'BELFORD ROXO', 261,
    'DUQUE DE CAXIAS', 250,
    'DUQUE DE CAXIAS', 251,
    'DUQUE DE CAXIAS', 252,
    'DUQUE DE CAXIAS', 253,
    'DUQUE DE CAXIAS', 254,
    'ITABORAÍ', 248,
    'ITAGUAÍ', 2380,
    'ITAGUAÍ', 2381,
    'ITAGUAÍ', 2382,
    'ITAGUAÍ', 2383,
    'ITAGUAÍ', 2384,
    'MAGÉ', 259,
    'MANGARATIBA',2386,
    'MANGARATIBA',2387,
    'MANGARATIBA',2388,
    'MARICÁ',249,
    'MESQUITA',2655)

data_rais$postal_code 是 data_frame 的一列,其数字可能以 munics_code 中 cods 列中的数字开头,也可能不以数字开头。 比如……

data_rais = data.frame(postal_code = c(2049253, 2033069, 2293513, 2411920, 2284937, 2341811, 2008638, 
                                       2279827, NA, 2386135, 2441900, 2392889, 2332114, 2254610, 
                                       2114414, 2089509, 2351781, 2451466, 2111632, 2070417, 2079485, 
                                       2328146, 2200329, 2116103, NA, 2449114, 2231708, NA, 
                                       NA, 2194253),
                       munic_name = NA)

注意:我不能删除 NA,我不想丢失它们。

【问题讨论】:

  • match 可能是你的朋友 :-)
  • @Base_R_Best_R 我希望可以,但由于我正在处理敏感数据,这是不可能的。
  • 如果数据很敏感,请创建一个具有相同感兴趣列的模型数据集。
  • 好的,我会这么做的。
  • "可能会或可能不会以munics_code 中 cods 列中的数字开头" 这是否意味着您需要部分匹配数字?

标签: r function for-loop


【解决方案1】:

我建议你使用match

data_rais$munic_name = munic_code[[1]][match(data_rais$munic,munic_code$cods)]

当您在 data_rais 中已有匹配项时,要处理条目,请使用以下命令:

data_rais$munic_name[!is.na(data_rais$postal_code)] = munic_code[[1]][match(data_rais$munic[!is.na(data_rais$postal_code)],munic_code$cods)]

不确定是否需要第二种方法,但要小心覆盖原始变量。如果您不确定添加另一个变量并手动检查匹配的几个条目。

【讨论】:

  • 那是真的 :-) 我很少使用这种表示法,通常建议使用$ 表示法,也更加一致。我只是感到困惑,因为 OP 有不同的数据框和变量名拼写......我相应地更新了我的答案
  • 抱歉,我刚刚意识到我的原始答案可能会覆盖已放置的条目,其中您在数据框中没有匹配项,但您的原始 data_rais
【解决方案2】:

如果我正确解释了您的代码,则您正在尝试将data_rais$munic_name 列设置为对应的municipio。这可以通过合并来完成:

df = merge(x = data_rais, y = munics_code, by.x = "postal_code", by.y = "cods", all.x = TRUE)

通过左合并 (all.x = T),您将保留 data_rais 中的 NA。如果您想将此列添加到其中,请将合并分配给 data_rais

【讨论】:

    猜你喜欢
    • 2012-06-06
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 2016-06-07
    • 1970-01-01
    相关资源
    最近更新 更多