합치기 - 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)