합치기 - r 상위 10




합계가있는 데이터 프레임에 행을 추가하려면 어떻게합니까? (7)

컬럼의 값을 합산하는 추가 행을 추가하고자하는 데이터 프레임이 있습니다. 예를 들어,이 데이터가 있다고 가정 해 봅시다.

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]) 를 만들었 기 때문에 모든 요소를 ​​공통 유형으로 변환했기 때문에 이러한 일이 발생하고 있음을 이해합니다 c("Total", colSums(x[,2:3]) 벡터 요소는 동일하며 파일 및 LOC 열에서도 동일한 작업이 수행됩니다.

이 작업을 수행하는 더 좋은 방법은 무엇입니까?


(1) 첫 번째 열에 "Language" 제목이 필요하지 않으면 행 이름을 사용하여 표현할 수 있습니다. (2) "Total" 아닌 "Sum" 으로 마지막 행에 레이블을 지정하면 addmargins 과 같이 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" 라는 레이블이 붙은 첫 번째 열과 "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

데이터 프레임에 열 총계를 정말로 갖고 싶습니까? 나에게 데이터 프레임의 해석은 이제 행에 달려있다. 예를 들어,

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

데이터를 부분 집합 화하기 시작하면 더 혼란스러워집니다. 예를 들어, 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 행이 잘못되었습니다!

개인적으로 나는 열 합계를 계산하여 별도의 벡터에 저장합니다.


모든 곱에 적용 할 수 있습니다.

적용 (df [당신이 원하지 않는 칼럼], 2, 합계)

그런 다음

경계

당신의 df에있는 그 데이터


열을 숫자로 강제 변환하면 원래의 본능이 작동합니다.

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

그런 다음 colSums () 및 rbind ()를 적용하십시오.


이 시도

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

이를 수행하는 tidyverse 방법은 bind_rows (또는 결국 add_rows )를 사용하고 합계를 계산하기 위해 summarise 하는 summarise 입니다. 여기서 문제는 하나를 제외한 모든 것에 대해 합계를 원하므로 트릭이 될 것입니다.

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

한 줄에 :

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

프리젠 테이션을 위해 내보내기 전에 마지막 단계라고 언급 했으므로 명확성을 위해 공백을 포함하는 열 이름을 사용할 수 있습니다 (예 : "총계"). 그렇다면 생성 된 data.frame이 일치하지 않는 열 이름으로 인한 오류없이 원래 데이터 세트로 rbind됩니다.

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

colnames(dfTotals) <- names(x)  

rbind(x, dfTotals)






dataframe