【问题标题】:Looping through vector of variable names and applying a function (in R)循环遍历变量名向量并应用函数(在 R 中)
【发布时间】:2016-05-20 14:13:02
【问题描述】:

所以我已经找到了一些相关的主题,但不知何故未能将它们应用到我的案例中。其实我觉得这个很简单: 我正在尝试编写一个循环,它将向我显示给定数据帧的每个变量的所有唯一值(我们称之为“数据”)。因此,我正在尝试应用 unqiue() fct。以下是我认为的解决方法:

i=0 
for (name in names(data)) {i=i+1; print(get(paste0((unique(names(data)[i])))))}

我猜我还没有弄清楚 get/assign/paste 的正确用法。

有什么帮助吗?提前致谢

【问题讨论】:

  • apply(data, 2, unique)
  • 完美,谢谢!由于我已经有一段时间没有使用 R 了,所以我忘记了 apply()。但是,据我了解, ?apply 此解决方案仅限于一次应用一个功能(对吗?)。如果例如我想查看的不是唯一条目本身,而只是每个变量的唯一条目数,我需要类似 length(unique(...)) 之类的东西,它不能使用 apply() 来执行,对吧?然后我必须选择来自 Psidom 的code for(name in names(data)) {print(length(unique(data[, name])))}
  • apply(data, 2, function(i) length(unique(i))
  • 您可以使用applylapply 应用多个函数。示例:lapply(data, function(i) { list(n=length(i), n_distinct=length(unique(i)), unique_values=unique(i)) })apply(data, 2, function(i) { list(n=length(i), n_distinct=length(unique(i)), unique_values=unique(i)) })

标签: r loops names


【解决方案1】:

如果你想写一个for循环来实现这个,你可以这样做:

for(name in names(data)) {
    print(unique(data[, name]))
}

您也可以使用lapply 函数。 lapply(data, unique).

更新applylapply 之间的性能比较:

df <- data.frame(x = 1:1000, y = 1:1000, z = 1:1000)
microbenchmark(lapply(df, unique), apply(df, 2, unique), times = 10000)
Unit: microseconds
                 expr     min      lq      mean  median      uq      max neval
   lapply(df, unique)  41.874  47.211  69.87959  51.317  55.832 10405.64 10000
 apply(df, 2, unique) 163.390 178.580 241.17553 187.201 209.370 11389.26 10000

【讨论】:

  • 我不知道 lapply 在数据帧上工作。 apply 不是更标准的数据帧处理方式吗?
  • lapply ("list apply") 适用于列表,数据框只是一种特殊类型的列表。
  • 根据我的经验,这可能只是一个错误,apply 通常很慢。
猜你喜欢
  • 2022-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 2019-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多