【问题标题】:apply a function on each row with different arguments对具有不同参数的每一行应用一个函数
【发布时间】:2015-09-02 10:42:12
【问题描述】:

我有如下DT的数据表,

         col1     col2    col3    col4    col5
1:          1       2       3        4      5
2:          4       5       6        8      9
3:          3       4       4        5      5
4:          4       3       5        3      3
5:          4        5       6        6      67 

我想为每一行计算某些列中的唯一值(对于每一行,我想使用不同的列来计算唯一值)

如何以尽可能少的步骤实现这一目标?表格很大,所以运行 for 循环是不可能的。

我正在寻找类似的解决方案

 DT[ , count_unique:= apply(DT[ , cols, with = F], 1, function(x) { length(unique(x)) })]

但这会失败,因为“cols”需要为每一行占用不同的列。

任何帮助将不胜感激。

【问题讨论】:

  • 你看过mapply它允许你为你的函数提供多个参数吗?
  • 可能最好将数据重新整形为长格式。但由于您的预期输出不清楚,我无法评论具体如何做。
  • 请提供所需的输出,因为我不明白您到底想要什么,如果您只想计算每行唯一项目的数量,这只是 apply(DT, 1, function(x) length(unique(x))) ;但是计算时要考虑的列数如何按行不同??
  • 努力遵循预期的结果应该是什么样子。您能否添加示例数据集的预期结果?
  • 您是否有另一个数据集显示每行要使用的列,还是基于随机抽样?

标签: r data.table apply


【解决方案1】:

我认为这对矩阵来说是最简单的,它有一个矩阵子集运算(顺便说一下,data.table 连接语法的灵感来自于此)。

假设这是您的数据:

m = matrix(c(1:4, 1,3,2,2, 1,2,3,3), ncol = 3)
#     [,1] [,2] [,3]
#[1,]    1    1    1
#[2,]    2    3    2
#[3,]    3    2    3
#[4,]    4    2    3

假设您想计算第 1 行和第 2 行的所有列的唯一值,仅计算第 3 行和第 4 行的第一列和最后一列。您可以表示的方式如下:

cols = matrix(c(1,1, 1,2, 1,3,
                2,1, 2,2, 2,3,
                3,1, 3,3,
                4,1, 4,3), ncol = 2, byrow = T)
#      [,1] [,2]
# [1,]    1    1
# [2,]    1    2
# [3,]    1    3
# [4,]    2    1
# [5,]    2    2
# [6,]    2    3
# [7,]    3    1
# [8,]    3    3
# [9,]    4    1
#[10,]    4    3

你想要的结果很容易计算:

tapply(m[cols], cols[,1], function(x) length(unique(x)))
#1 2 3 4 
#1 2 1 2 

【讨论】:

    猜你喜欢
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 2014-08-12
    • 2018-12-22
    • 2017-07-19
    • 2021-10-25
    • 2020-01-22
    相关资源
    最近更新 更多