我想計算資料集中每第二列的行均值,意思是:A 和 B、C 和 D、E 和 F 列的平均值。我的資料如下所示:
|A|B|C|D|E|F|
|-|-|-|-|-|-|
|0|1|1|1|0|1|
|0|0|1|1|0|0|
|1|1|0|0|0|1|
|0|1|1|1|1|1|
|1|1|1|1|0|1|
作為一個條件,我想包括兩個值都應該大于 0 來計算平均值:
data$meanAB <-if_else(A > 0 & B > 0, rowMeans(data[,1:2]), 0)
我設法為兩列執行此操作,但我想要一個解決方案,將新列添加到我的資料框中,每兩列的行均值。我想以這樣的表格結束:
|A|B|C|D|E|F|meanAB|meanCD|meanEF|
|-|-|-|-|-|-|-|-|-|
|0|1|1|1|0|1|0|1|0|
|0|0|1|1|0|0|0|1|0|
|1|1|0|0|0|1|1|0|0|
|0|1|1|1|1|1|0|1|1|
|1|1|1|1|0|1|1|1|0|
|0|1|1|1|0|1|0|1|0|
|0|0|1|1|0|0|0|1|0|
|1|1|0|0|0|1|1|0|0|
|0|1|1|1|1|1|0|1|1|
|1|1|1|1|0|1|1|1|0|
提前致謝!
uj5u.com熱心網友回復:
基本 R 選項使用split.default-
cbind(df, sapply(split.default(df, ceiling(seq_along(df)/2)), function(x) {
ifelse(x[1] > 0 & x[2] > 0, rowMeans(x), 0)
}))
# A B C D E F 1 2 3
#1 0 1 1 1 0 1 0 1 0
#2 0 0 1 1 0 0 0 1 0
#3 1 1 0 0 0 1 1 0 0
#4 0 1 1 1 1 1 0 1 1
#5 1 1 1 1 0 1 1 1 0
其中第 1 列是 A 和 B 的平均值,第 2 列是 C 和 D 的平均值,依此類推。
uj5u.com熱心網友回復:
這是一種方法。它使用一種cumsum技巧來獲取一組兩兩列的列。然后它遍歷拆分的資料并計算行均值。最后,它將輸出與原始輸入資料結合起來。
cs <- cumsum(seq_len(ncol(data)) %% 2)
res <- lapply(split(as.list(data), cs), \(x){
rowMeans(as.data.frame(x))
})
res <- do.call(cbind, res)
colnames(res) <- paste0("mean", tapply(names(data), cs, paste, collapse = ""))
cbind(data, res)
# A B C D E F meanAB meanCD meanEF
#1 0 1 1 1 0 1 0.5 1 0.5
#2 0 0 1 1 0 0 0.0 1 0.0
#3 1 1 0 0 0 1 1.0 0 0.5
#4 0 1 1 1 1 1 0.5 1 1.0
#5 1 1 1 1 0 1 1.0 1 0.5
資料dput格式
data <-
structure(list(A = c(0L, 0L, 1L, 0L, 1L), B = c(1L, 0L, 1L, 1L,
1L), C = c(1L, 1L, 0L, 1L, 1L), D = c(1L, 1L, 0L, 1L, 1L), E = c(0L,
0L, 0L, 1L, 0L), F = c(1L, 0L, 1L, 1L, 1L)), row.names = c(NA,
-5L), class = "data.frame")
uj5u.com熱心網友回復:
一個tidyverse解決方案是。對我來說,這是非常簡短和整潔的。
library(dplyr)
#>
#> Attache Paket: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
data <-
structure(
list(
A = c(0L, 0L, 1L, 0L, 1L),
B = c(1L, 0L, 1L, 1L, 1L),
C = c(1L, 1L, 0L, 1L, 1L),
D = c(1L, 1L, 0L, 1L, 1L),
E = c(0L, 0L, 0L, 1L, 0L),
F = c(1L, 0L, 1L, 1L, 1L)
),
row.names = c(NA, -5L),
class = "data.frame"
)
data %>%
rowwise() %>%
mutate(meanAB = mean(c(A, B)),
meanCD = mean(c(C, D)),
meanEF = mean(c(E, F)))
#> # A tibble: 5 x 9
#> # Rowwise:
#> A B C D E F meanAB meanCD meanEF
#> <int> <int> <int> <int> <int> <int> <dbl> <dbl> <dbl>
#> 1 0 1 1 1 0 1 0.5 1 0.5
#> 2 0 0 1 1 0 0 0 1 0
#> 3 1 1 0 0 0 1 1 0 0.5
#> 4 0 1 1 1 1 1 0.5 1 1
#> 5 1 1 1 1 0 1 1 1 0.5
由reprex 包(v2.0.1)于 2021 年 10 月 27 日創建
uj5u.com熱心網友回復:
我們可以用
data[paste0('mean', 1:3)] <- sapply(split.default(df, as.integer(gl(ncol(df),
2, ncol(df)))), function(x) {
i1 <- rowSums(x > 0) == 2
replace(rowMeans(x), !i1, 0)})
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/338645.html
