여러 개의 열 집합을 모으는 문제는 이미 여기에서 다루었습니다 : Gather multiple sets of columns, 제 경우에는 열이 고유하지 않습니다.중복 된 열 집합을 단일 열로 집합하십시오.
I 다음 데이터가 : 질문 위한
- 식별자 :
input <- data.frame( id = 1:2, question = c("a", "b"), points = 0, max_points = c(3, 5), question = c("c", "d"), points = c(0, 20), max_points = c(5, 20), check.names = F, stringsAsFactors = F ) input #> id question points max_points question points max_points #> 1 1 a 0 3 c 0 5 #> 2 2 b 0 5 d 20 20
첫번째 열은 ID이고, 그때 많은 반복 열 (원래의 데이터 셋이 133 개 컬럼을 가짐)이이
- 포인트 부여
- 최대 포인트
나는이 구조를 끝내고 싶습니다 : 나는 몇 가지를 시도
expected <- data.frame(
id = c(1, 2, 1, 2),
question = letters[1:4],
points = c(0, 0, 0, 20),
max_points = c(3, 5, 5, 20),
stringsAsFactors = F
)
expected
#> id question points max_points
#> 1 1 a 0 3
#> 2 2 b 0 5
#> 3 1 c 0 5
#> 4 2 d 20 20
:
tidyr::gather(input, key, val, -id)
reshape2::melt(input, id.vars = "id")
가 모두 원하는 출력을 제공하지 않습니다. 또한 여기에 표시된 것보다 많은 열을 사용하면 중복 열이 너무 많아서 gather
이 더 이상 작동하지 않습니다. 해결 방법으로
나는이 시도 :이 문제는 이미 여기에 설명 된 Duplicate identifiers for rows (3, 9), (4, 10), (1, 7), (2, 8)
: Unexpected behavior with tidyr를,하지만 난 다른를 추가하는 방법을 왜/I 모르는 오류를 제공
# add numbers to make col headers "unique"
names(input) <- c("id", paste0(1:(length(names(input)) - 1), names(input)[-1]))
# gather, remove number, spread
input %>%
gather(key, val, -id) %>%
mutate(key = stringr::str_replace_all(key, "[:digit:]", "")) %>%
spread(key, val)
식별자. 대부분의 경우이 문제는 주요 문제가 아닐 수 있습니다. 아마 모든 것을 다르게 다뤄야하기 때문입니다.
내 문제를 어떻게 해결할 수 있습니까? tidyr
또는 기본으로 수행 할 수 있습니까? 나는 data.table
을 사용하는 방법을 모르지만, 간단한 해결책이있는 경우에 대해서도 그렇게 할 것입니다.
질문, max_points 및 포인트 열 모두 실제로 동일한 이름이 지정 되었습니까? –
아마도'rbind (input [, c (1, 2 : 4)], input [, c (1, 5 : 7)])'? – zx8754
@MikeyMike 예. –