dplyr由某些列逐行显示

时间:2016-04-09 20:55:24

标签: r data.table dplyr

为某些列应用函数 colors() # The color list having 657 colors colors()[16:30] # Choose any 15 you require by providing index b/w 1 and 657 colors()[601:615] dplyr 方法是什么?例如,我想抓取所有rowwise列,并根据行总和将它们转换为百分比。我展示了如何在基地做到这一点。在 dplyr 链中怎么样?很高兴看到 data.table 形式(虽然这里的偏好会转到 dplyr 解决方案)。

V,

3 个答案:

答案 0 :(得分:7)

在data.table中,您可以

library(data.table)
setDT(x)

x[, grep("^V",names(DT)) := .SD/Reduce(`+`, .SD), .SDcols = V1:V5]

   A         V1        V2        V3         V4         V5
1: A 0.28571429 0.0000000 0.2857143 0.07142857 0.35714286
2: B 0.23076923 0.2307692 0.3076923 0.15384615 0.07692308
3: C 0.44444444 0.0000000 0.4444444 0.00000000 0.11111111
4: D 0.07142857 0.3571429 0.1428571 0.07142857 0.35714286
5: E 0.00000000 0.2222222 0.3333333 0.44444444 0.00000000

要计算忽略NA值的分母,我猜rowSums是一个选项,但它会将.SD强制转换为矩阵作为中间步骤。

答案 1 :(得分:6)

您可以将spreadgather合并,以获得以下单一渠道:

x <- data.frame(A=LETTERS[1:5], as.data.frame(matrix(sample(0:5, 25, T), ncol=5)))

y <- x %>% 
        gather(V, val, -A) %>% 
        group_by(A) %>% 
        mutate(perc = val / sum(val)) %>% 
        select(-val) %>%
        spread(V, perc)

使用tidy data可以轻松获得任何分组总和(行,列或任何嵌套索引级别)并计算百分比。 spreadgather会让您进出输入数据格式。

答案 2 :(得分:0)

另一种“ tidyverse”解决方案是在select中使用mutate。例如

library(tidyverse)

x <- data.frame(A=LETTERS[1:5], as.data.frame(matrix(sample(0:5, 25, T), ncol=5)))

x %>% 
  mutate(row_counts = select_if(., is.numeric) %>% rowSums()) %>% 
  mutate_at(vars(contains("V")), funs(./row_counts)) %>% 
  select(-row_counts)
#>   A        V1         V2        V3        V4        V5
#> 1 A 0.0000000 0.14285714 0.1428571 0.5714286 0.1428571
#> 2 B 0.0000000 0.62500000 0.1250000 0.1250000 0.1250000
#> 3 C 0.2222222 0.11111111 0.2222222 0.1111111 0.3333333
#> 4 D 0.3000000 0.50000000 0.1000000 0.1000000 0.0000000
#> 5 E 0.3333333 0.06666667 0.1333333 0.3333333 0.1333333

reprex package(v0.2.1)于2019-02-16创建