r - 프레임 - 특정 행 추출




그룹 행을 데이터 프레임에 추가하는 방법 (6)

@ useR의 탁월한 Base R 응답과 유사하게, 여기에 tidyverse 솔루션이 있습니다.

library(purrr)

map2_df(df1, df2, c)
  A B C
1 1 2 3
2 5 7 9
3 1 1 1
4 2 2 2
5 3 3 3
6 4 4 4

여기에 처음으로이 질문에 답했을 때의 몇 가지 다른 (덜 바람직한) 옵션이 있습니다.

library(dplyr)

bind_rows(df1, df2 %>% mutate(B=A, C=A))

또는 df1에서 열의 수와 이름을 동적으로 가져 오려면 다음과 같이하십시오.

bind_rows(df1,
          df2[,rep(1,ncol(df1))] %>% setNames(names(df1)))

그리고 하나 이상의 Base R 방법 :

rbind(df1, setNames(df2[,rep(1,ncol(df1))], names(df1)))

나는이 df1 :

A B C
1 2 3
5 7 9

여기서 ABC 는 열 이름입니다.

하나의 열에 다른 df2가 있습니다.

A
1
2
3
4

df1의 각 열에 대해 df2를 추가하여 최종 데이터 프레임을 만듭니다.

A B C 
1 2 3
5 7 9
1 1 1
2 2 2
3 3 3
4 4 4

그것을 할 수 있습니까?


나는 R을 사랑한다. 여기 또 다른 Base R 솔루션이 있지만, mapply .

data.frame(mapply(c, df1, df2))

결과:

  A B C
1 1 2 3
2 5 7 9
3 1 1 1
4 2 2 2
5 3 3 3
6 4 4 4

노트 :

거의 모든 다른 솔루션과 같이 colnames를 처리 할 필요가 없습니다 ... 이것이 작동하는 이유의 핵심은 " mapply 가 ... [각 요소] (가장 긴 길이로 재순환 됨)의 값에 대해 FUN을 호출한다는 것입니다. . [요소] "(참조 : ?mapply ). 즉, df2$A 이 가진 많은 열에 df2$A 가 재활용됩니다.

데이터:

df1 = structure(list(A = c(1L, 5L), B = c(2L, 7L), C = c(3L, 9L)), .Names = c("A", 
                                                                               "B", "C"), class = "data.frame", row.names = c(NA, -2L))
df2 = structure(list(A = 1:4), .Names = "A", row.names = c(NA, -4L), class = "data.frame")

데이터:

df1 <- data.frame(A=c(1,5),
                  B=c(2,7),
                  C=c(3,9))
df2 <- data.frame(A=c(1,2,3,4))

해결책:

df2 <- matrix(rep(df2$A, ncol(df1)), ncol=ncol(df1))
colnames(df2) <- colnames(df1)
rbind(df1,df2)

결과:

  A B C
1 1 2 3
2 5 7 9
3 1 1 1
4 2 2 2
5 3 3 3
6 4 4 4

완전을 기하기 위해 컬럼 이름을 처리 할 필요가없는 data.table 접근법이있다.

library(data.table)
setDT(df1)[, lapply(.SD, c, df2$A)]
   A B C
1: 1 2 3
2: 5 7 9
3: 1 1 1
4: 2 2 2
5: 3 3 3
6: 4 4 4

OP는 df2 가 하나의 열로 만 구성 df2 설명 df2 .

이 방법의 기본 R 버전도 있습니다.

data.frame(lapply(df1, c, df2$A))
  A B C
1 1 2 3
2 5 7 9
3 1 1 1
4 2 2 2
5 3 3 3
6 4 4 4

이는 d.b's 접근 방식과 비슷하지만 열 이름을 처리 할 필요가 없습니다.


base R 메소드를 사용할 수 있습니다.

rbind(df1, setNames(as.data.frame(do.call(cbind, rep(list(df2$A), 3))), names(df1)))
#  A B C
#1 1 2 3
#2 5 7 9
#3 1 1 1
#4 2 2 2
#5 3 3 3
#6 4 4 4

데이터

df1 <- structure(list(A = c(1L, 5L), B = c(2L, 7L), C = c(3L, 9L)), .Names = c("A", 
"B", "C"), class = "data.frame", row.names = c(NA, -2L))

df2 <- structure(list(A = 1:4), .Names = "A", class = "data.frame",
row.names = c(NA, -4L))

purrr 의 솔루션. purrr 를 사용하여 map_dfc 모든 열을 반복하여 모든 요소를 df2$A 와 결합합니다.

library(purrr)

map_dfc(df1, ~c(., df2$A))

# A tibble: 6 x 3
      A     B     C
  <int> <int> <int>
1     1     2     3
2     5     7     9
3     1     1     1
4     2     2     2
5     3     3     3
6     4     4     4

데이터

df1 <- structure(list(A = c(1L, 5L), B = c(2L, 7L), C = c(3L, 9L)), .Names = c("A", 
                                                                               "B", "C"), class = "data.frame", row.names = c(NA, -2L))

df2 <- structure(list(A = 1:4), .Names = "A", class = "data.frame",
                 row.names = c(NA, -4L))




rbind