programing

각 열에 대한 합계로 데이터 프레임에 행 추가

javajsp 2023. 9. 16. 08:40

각 열에 대한 합계로 데이터 프레임에 행 추가

각 열에 대한 값을 합산하는 행을 추가하고자 하는 데이터 프레임이 있습니다.예를 들어, 다음과 같은 데이터가 있다고 가정해 보겠습니다.

x <- data.frame(Language=c("C++", "Java", "Python"), 
                Files=c(4009, 210, 35), 
                LOC=c(15328,876, 200), 
                stringsAsFactors=FALSE)    

데이터는 다음과 같습니다.

  Language Files   LOC
1      C++  4009 15328
2     Java   210   876
3   Python    35   200

내 본능은 이렇게 하는 겁니다

y <- rbind(x, c("Total", colSums(x[,2:3])))

그리고 이것은 총계를 계산합니다.

> y
  Language Files   LOC
1      C++  4009 15328
2     Java   210   876
3   Python    35   200
4    Total  4254 16404

문제는 파일과 LOC 열이 모두 문자열로 변환되었다는 것입니다.

> y$LOC
[1] "15328" "876"   "200"   "16404"

가 를 에 이 으로 으로 가 를 이 에 c("Total", colSums(x[,2:3])숫자와 문자열을 모두 입력하고 모든 요소를 공통 유형으로 변환하여 모든 벡터 요소가 동일하도록 합니다.그러면 Files(파일) 및 LOC(로컬) 열에서도 동일한 현상이 발생합니다.

어떻게 하는 게 더 좋을까요?

참조 adorn_totals()관리인 패키지에서:

library(janitor)
x %>%
  adorn_totals("row")

#>  Language Files   LOC
#>       C++  4009 15328
#>      Java   210   876
#>    Python    35   200
#>     Total  4254 16404

숫자 열은 클래스 숫자로 남아 있습니다.

면책 사항:저는 이 패키지를 만들었고, 다음을 포함합니다.adorn_totals()정확히 이 작업을 위해 만들어진 것입니다.

A tidyverse이것을 하는 방법은 사용하는 것일 것입니다.bind_rows 결국 는으로)add_row및 ) summarise계산을 하기 위해서 입니다.여기서 문제는 우리가 1개를 제외한 모든 것에 대한 합계를 원한다는 것입니다. 따라서 트릭은 다음과 같습니다.

summarise_all(x, ~if(is.numeric(.)) sum(.) else "Total")

한 줄로:

x %>%
  bind_rows(summarise_all(., ~if(is.numeric(.)) sum(.) else "Total"))

dplyr >=1.0으로 편집

사용할 수도 있습니다.across() 더 하게 표현됩니다 즉, 은 과 과 은

x %>%
  bind_rows(summarise(.,
                      across(where(is.numeric), sum),
                      across(where(is.character), ~"Total")))

원하는 것을 얻을 수 있는 방법이 있습니다. 하지만 더 우아한 해결책이 있을 수도 있습니다.

rbind(x, data.frame(Language = "Total", t(colSums(x[, -1]))))

로, 이 요 하지 을 의 요 하지 로 이 을 의 Language기둥.

합니까, 을 Language 이 합니까 이 더 합니까? 아니면 해당 열을 다음과 같이 생각하는 것이 더 적합합니까?row.names data& 의 4개 로 변경됩니다. ? data.frame 3 의 4 2 (Files & LOC) 4 됩니다 4

x <- data.frame(Files = c(4009, 210, 35), LOC = c(15328,876, 200),
                row.names = c("C++", "Java", "Python"), stringsAsFactors = FALSE)    
x["Total" ,] <- colSums(x)


> x
       Files   LOC
C++     4009 15328
Java     210   876
Python    35   200
Total   4254 16404

이거 먹어봐요.

y[4,] = c("Total", colSums(y[,2:3]))

Nicolas Ratto의 답변을 확장합니다. 만약 당신이 훨씬 더 많은 열을 가지고 있다면 당신은 사용할 수 있습니다.

x %>% add_row(Language = "Total", summarise(., across(where(is.numeric), sum)))

만약 (1) 우리가 필요하지 않다면,"Language"행 수 ) 째에행을여낼수약고막다을과도이을면2(e다막g도이을ons(klsnd약setntefnwwtt째g"Sum""Total"그러면 우리는 사용할 수 있습니다.addmargins다음과 같이:

rownames(x) <- x$Language
addmargins(as.table(as.matrix(x[-1])), 1)

제공:

       Files   LOC
C++     4009 15328
Java     210   876
Python    35   200
Sum     4254 16404

에 에 을 을 에 "Language" 총 총에이는고d는이wlde고총에"Total"그러면 좀 더 길어집니다.

rownames(x) <- x$Language
Total <- sum
xa <- addmargins(as.table(as.matrix(x[-1])), 1, FUN = Total)
data.frame(Language = rownames(xa), as.matrix(xa[]), row.names = NULL)

제공:

  Language Files   LOC
1      C++  4009 15328
2     Java   210   876
3   Python    35   200
4    Total  4254 16404

이거 먹어봐요.

library(tibble)
x %>% add_row( Language="Total",Files = sum(.$Files),LOC = sum(.$LOC) )
df %>% bind_rows(purrr::map_dbl(.,sum))

데이터 프레임에 열 합계를 포함시키시겠습니까?이제 데이터 프레임의 해석은 행에 따라 달라집니다.예를들면,

  • 행 1-(n-1): 특정 언어와 연결된 파일 수
  • 행: 모든 언어와 연결된 파일 수

데이터를 부분 집합화하기 시작하면 더 혼란스러워집니다.예를 들어, 어떤 언어에 100개 이상의 파일이 있는지 알고 싶다고 가정합니다.

> x = data.frame(Files=c(4009, 210, 35), 
                LOC=c(15328,876, 200), 
                row.names=c("C++", "Java", "Python"), 
                stringsAsFactors=FALSE)    
> x["Total" ,] = colSums(x)
> x[x$Files > 100,]
       Files   LOC
C++    4009 15328
Java    210   876
Total  4254 16404#But this refers to all languages!

Total행은 이제 틀렸습니다!

개인적으로 저는 열 합을 계산해서 별도의 벡터에 저장할 것입니다.

프레젠테이션을 내보내기 전 마지막 단계라고 언급했으므로, 명확한 설명을 위해 공백이 포함된 열 이름이 있을 수 있습니다(예: "Grand Total").그렇다면 다음은 생성된 data.frame이 일치하지 않는 열 이름으로 인해 발생하는 오류 없이 원래 데이터 집합에 바인딩되도록 보장합니다.

dfTotals <- data.frame(Language="Total",t(colSums(x[,-1]))))

colnames(dfTotals) <- names(x)  

rbind(x, dfTotals)

만약 당신이 열을 숫자로 강요한다면 당신의 원래 본능은 효과가 있을 것입니다.

y$LOC <- as.numeric(y$LOC)
y$Files <- as.numeric(y$Files)

그리고 colSums()와 rbind()를 적용합니다.

언급URL : https://stackoverflow.com/questions/4946873/add-row-to-a-data-frame-with-total-sum-for-each-column