【问题标题】:How to efficiently use factors in r?如何有效地使用 r 中的因子?
【发布时间】:2017-01-21 05:30:01
【问题描述】:

我想使用因子,但遇到了一些问题。我的问题可能表明我并不完全了解因素:)

以以下数据“my_data”为例(实际数据要大得多,但形式相似):

0,stack
0,exchange
0,overflow
1,list
1,stack

第一列是user_id,第二列是用户使用的标签。我想计算所有用户的标签交集。为了有效地做到这一点,我想在整数而不是字符串上计算它们。

所以我认为因素是要走的路。从第 2 列中提取一个因素给我一个看起来像这样的因素:

Factor w/ levels "stack", "exchange", "overflow", "list": 1 2 3 4 1

接下来我要做的是:

unique(my_data[my_data$V1 == 0, 2])

获取 id 为 0 的用户的所有标签,这当然会返回一个带有字符串的向量。我现在如何从这个向量的因子中获取相应的索引?

【问题讨论】:

  • as.numeric(unique(my_data[my_data$V1 == 0, 2]))?
  • 您的预期结果是什么?
  • 效率方面,无论您使用因子还是字符串都不应该有所不同:据我所知,较新版本的 R 对向量/data.frame 中的字符串执行字符串池,因此比较实际上只是一个指针比较,与比较整数相同。
  • 好的,谢谢,我会尝试不使用因子。我仍然有点好奇如何获取 (1, 2, 3) 而不是 (stack, exchange, overflow)。 @Roland 的回答可能是正确的,但 as.numeric 显然不知道要使用哪个因子进行转换。
  • “我们应该忘记小的效率,比如说大约 97% 的时间:过早的优化是万恶之源”。如果您有 1MM+ 行数据并且非常频繁地执行此操作,那么这似乎是担心高效执行此操作的好时机。否则就顺其自然吧。

标签: r dataframe r-factor


【解决方案1】:

我可以建议 data.table 包!

test <- data.table(id = c(0, 0, 0, 1, 1), tag = c('a', 'b', 'c', 'd', 'a'))

## Sort IDs by tag 
test[,id, by = tag]

## Return True for tags used by ID == 0, False otherwise
test[,id==0, by = tag]

## Return tags used by ID == 0
test[id ==0,id, by = tag]
test[id ==0,tag]

## Return tags used by all IDs
n.ids<-length(unique(test$id))
test[length(unique(id==n.ids)),tag]

希望有帮助!

【讨论】:

    猜你喜欢
    • 2011-04-08
    • 2014-09-06
    • 2015-12-14
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多