data.frame 또는 행렬의 행 합
저는 행을 관찰로 하고 열을 유전자 표시로 하는 매우 큰 데이터 프레임을 가지고 있습니다.R을 사용하여 각 관측치에 대해 선택한 열 개수의 합을 포함하는 새 열을 생성하고자 합니다.
만약 내가 200개의 열과 100개의 행을 가지고 있다면, 나는 말하기 열 43부터 167까지의 합으로 100개의 행을 가지고 있는 새로운 열을 만들고 싶습니다.열에는 1 또는 0이 있습니다.각 행의 합계가 포함된 새로운 열로, 유전자 표시가 가장 많은 사람들을 분류할 수 있을 것입니다.
저는 그것이 다음과 유사하다고 생각합니다.
data$new=sum(data$[,43:167])
사용가능rowSums
rowSums(data)
당신이 원하는 것을 줘야 합니다
rowSums 함수(그렉이 언급한 바와 같이)는 원하는 대로 수행되지만, 답변에서 부분 집합 기술을 혼합하고 있으므로 "[]"를 사용할 때 "$"를 사용하지 마십시오. 코드는 다음과 같습니다.
data$new <- rowSums( data[,43:167] )
합이 아닌 다른 함수를 사용하려면 행 또는 열에 일반 함수를 적용하는 데 적용합니다.
저는 데이터 테이블의 모든 열에 대한 합계를 파악하고 위 솔루션을 구현하는 데 문제가 발생할 수 있는 방법을 찾고자 여기에 왔습니다.모든 열에 합을 사용하여 열을 추가하는 방법을 사용합니다.cbind
함수:
cbind(data, total = rowSums(data))
이 메서드는 다음을 추가합니다.total
데이터에 열을 제공하고 위의 솔루션을 사용하여 모든 열을 합하려고 할 때 발생하는 정렬 문제를 방지합니다(이 문제에 대한 논의는 아래 게시물 참조).
완성도를 위해서.여기에 언급되지 않은 다른 방법들을 나열하겠습니다. 이것은 행렬이 있는 dplyr 구문을 사용하여 동일한 작업을 수행하는 다른 방법입니다.
mat = matrix(1:12, ncol = 3)
library(dplyr)
mat %>% as_tibble() %>%
mutate(sum = rowSums(across(where(is.numeric))))
# A tibble: 4 x 4
V1 V2 V3 sum
<int> <int> <int> <dbl>
1 1 5 9 15
2 2 6 10 18
3 3 7 11 21
4 4 8 12 24
또는 c_across:
mat %>% as_tibble() %>%
rowwise() %>%
mutate(sumrange = sum(c_across(), na.rm = T))
또는 열 이름으로 특정 열을 선택합니다.
mat %>% as_tibble() %>%
mutate( 'B1' = V1, B2 = V2) %>%
rowwise() %>%
mutate(sum_startswithB =
sum(c_across(starts_with("B")), na.rm = T))
V1 V2 V3 B1 B2 sum_startswithx
<int> <int> <int> <int> <int> <int>
1 1 5 9 1 5 6
2 2 6 10 2 6 8
3 3 7 11 3 7 10
4 4 8 12 4 8 12
이 경우 첫 번째 열부터 네 번째 열까지 열 인덱스 기준:
mat %>% as_tibble() %>%
mutate( 'B1' = V1, B2 = V2) %>%
rowwise() %>%
mutate(SumByIndex = sum(c_across(c(1:4)), na.rm = T))
V1 V2 V3 B1 B2 SumByIndex
<int> <int> <int> <int> <int> <int>
1 1 5 9 1 5 16
2 2 6 10 2 6 20
3 3 7 11 3 7 24
4 4 8 12 4 8 28
정규식 사용:
mat %>% as_tibble() %>%
mutate( 'B1' = V1, B2 = V2) %>%
mutate(sum_V = rowSums(.[grep("V[2-3]", names(.))], na.rm = TRUE),
sum_B = rowSums(.[grep("B", names(.))], na.rm = TRUE))
V1 V2 V3 B1 B2 sum_V sum_B
<int> <int> <int> <int> <int> <dbl> <dbl>
1 1 5 9 1 5 14 6
2 2 6 10 2 6 16 8
3 3 7 11 3 7 18 10
4 4 8 12 4 8 20 12
열에 걸쳐 합, 평균, 최대, 최소, 분산 및 표준 편차를 선택할 수 있으므로 함수 적용을 사용하는 것이 더 편리합니다.
mat %>% as_tibble() %>%
mutate( 'B1' = V1, B2 = V2) %>%
mutate(sum = select(., V1:B1) %>% apply(1, sum, na.rm=TRUE)) %>%
mutate(mean = select(., V1:B1) %>% apply(1, mean, na.rm=TRUE)) %>%
mutate(max = select(., V1:B1) %>% apply(1, max, na.rm=TRUE)) %>%
mutate(min = select(., V1:B1) %>% apply(1, min, na.rm=TRUE)) %>%
mutate(var = select(., V1:B1) %>% apply(1, var, na.rm=TRUE)) %>%
mutate(sd = select(., V1:B1) %>% apply(1, sd, na.rm=TRUE))
V1 V2 V3 B1 B2 sum mean max min var sd
<int> <int> <int> <int> <int> <int> <dbl> <int> <int> <dbl> <dbl>
1 1 5 9 1 5 16 4 9 1 14.7 3.83
2 2 6 10 2 6 20 5 10 2 14.7 3.83
3 3 7 11 3 7 24 6 11 3 14.7 3.83
4 4 8 12 4 8 28 7 12 4 14.7 3.83
참고: var와 sd의 동일한 출력은 데이터가 선형적으로 생성되기 때문에 오류가 아닙니다.1:12
첫 번째 열의 값을 계산하는 것을 확인할 수 있습니다.
> sd(c(1,5,9,1))
[1] 3.829708
> sd(c(2,6,10,2))
[1] 3.829708
각 방법에 대한 경과 시간을 예를 들어 지원하도록 하겠습니다.
mat = matrix(runif(4e6), ncol = 50)
적용 함수와 행 합계 간 비교:
apply_func <- function(x) {
apply(x, 1, sum)
}
r_sum <- function(x) {
rowSums(x)
}
# Compare the methods
microbenchmark(
apply_func = app(mat),
r_sum = r_sum(mat), times = 1e5
)
------ 출력 - 밀리초 단위 ------------
expr min lq mean median uq max neval
apply_func 207.84661 260.34475 280.14621 279.18782 294.85119 354.1821 100
r_sum 10.76534 11.53194 13.00324 12.72792 14.34045 16.9014 100
행 합 함수의 평균 시간이 적용 함수의 평균 시간보다 21배 작다는 것을 알 수 있습니다.행렬에 열이 너무 많으면 경과 시간의 차이가 더 크게 나타날 수 있습니다.
이 될 수 할 여지 없이 .rowSums
함수:
data$new <- Reduce(function(x, y) {
x + data[, y]
}, init = data[, 43], 44:167)
관리자 패키지에서 adorn_totals 기능을 사용할 수도 있습니다.arg:where에 제공하는 값에 따라 열 또는 행을 합할 수 있습니다.
예:
tibble::tibble(
a = 10:20,
b = 55:65,
c = 2010:2020,
d = c(LETTERS[1:11])) %>%
janitor::adorn_totals(where = "col") %>%
tibble::as_tibble()
결과:
# A tibble: 11 x 5
a b c d Total
<int> <int> <int> <chr> <dbl>
1 10 55 2010 A 2065
2 11 56 2011 B 2067
3 12 57 2012 C 2069
4 13 58 2013 D 2071
5 14 59 2014 E 2073
6 15 60 2015 F 2075
7 16 61 2016 G 2077
8 17 62 2017 H 2079
9 18 63 2018 I 2081
10 19 64 2019 J 2083
11 20 65 2020 K 2085
언급URL : https://stackoverflow.com/questions/3991905/sum-rows-in-data-frame-or-matrix
'itsource' 카테고리의 다른 글
WooCommerce - get_order()가 작동하지 않습니다. (0) | 2023.10.14 |
---|---|
opencv를 사용한 비디오 처리를 포함한 출력 (0) | 2023.10.14 |
표시 방법: 인라인 블록 (0) | 2023.10.14 |
C# Windows 응용 프로그램을 통해 MariaDB 데이터베이스에 쿼리를 연결하고 전송하려면 어떻게 해야 합니까? (0) | 2023.10.14 |
MySql 명령줄 클라이언트를 사용하여 다른 포트에 연결 (0) | 2023.10.14 |