itsource

data.frame 또는 행렬의 행 합

mycopycode 2023. 10. 14. 10:06
반응형

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

반응형