确定数据帧中的有效位数

时间:2019-04-15 08:10:29

标签: r dataframe vectorization

我有一个巨大的数据框,下面给出了3列11行的示例:

df <- structure(list(A = c(61960, 273, 439, 38877, 75325, 80929, 
23028, 57240, 10140, 25775, 7286), B = c(10, 12, 11, 13, 2, 1, 1, 
1, 1, 1, 1), C = c(122, 140, 163, 12, 190, 16, 14, 18, 15, 17, 16
)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-11L))

对于数据帧的每一列,我想计算该列中每个数量级的有效位数的中位数。

因此,例如,对于上面的A列,存在3个数量级(10 ^ 3、10 ^ 4、10 ^ 5)。第一个数字有4位数字(最后一个零不计数),第二个数字有3位,依此类推。

我的输出应该是每一列的列表,其中一个元素是一个包含数量级的向量,第二个元素是有效位数的中位数。 因此,对于每列我都希望有一个列表,我的输出将是一个列表列表。例如A列:

L[["A"]] = list(c(5,4,3), c(5, 4, 3))

为什么这是列表?在A列中,存在3个不同的数量级:10 ^ 5、10 ^ 4、10 ^ 3。 10 ^ 5 o.o.m.的有效位数的中位数是5、10 ^ 4、4和10 ^ 3、3。

有没有办法有效地做到这一点?使用类似mutatemap的名称(而不是apply,因为这与使用循环相同)。

1 个答案:

答案 0 :(得分:1)

我们可以通过以下操作来实现:遍历各列,然后按该列的nchar分组,用sub删除末尾的0,得到median并返回一个{中位数的{1}}以及list中的分组变量(返回为命名向量的名称)

tapply

或者也可以使用lapply(df, function(x) { x1 <- tapply(nchar(sub("0+$", "", x)), nchar(x), FUN = median ) list(as.integer(names(x1)), as.numeric(x1)) }) #$A #$A[[1]] #[1] 3 4 5 #$A[[2]] #[1] 3 4 5 #$B #$B[[1]] #[1] 1 2 #$B[[2]] #[1] 1 2 #$C #$C[[1]] #[1] 2 3 #$C[[2]] #[1] 2.0 2.5 并将其作为单个数据集返回

tidyverse