为某些列应用函数 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,
答案 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)
您可以将tidyr的spread
和gather
与dplyr合并,以获得以下单一渠道:
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可以轻松获得任何分组总和(行,列或任何嵌套索引级别)并计算百分比。 spread
和gather
会让您进出输入数据格式。
答案 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创建