열이 목록 인 data.frame 만들기


80

목록 열을 추가하는 방법을 알고 있습니다.

> df <- data.frame(a=1:3)
> df$b <- list(1:1, 1:2, 1:3)
> df
  a       b
1 1       1
2 2    1, 2
3 3 1, 2, 3

이것은 작동하지만 그렇지 않습니다.

> df <- data.frame(a=1:3, b=list(1:1, 1:2, 1:3))
Error in data.frame(1L, 1:2, 1:3, check.names = FALSE, stringsAsFactors = TRUE) : 
  arguments imply differing number of rows: 1, 2, 3

왜?

또한 df한 번의 호출로 (위) 를 만드는 방법 이 data.frame있습니까?

답변:


103

다음에서 약간 모호함 ?data.frame:

목록이나 데이터 프레임 또는 행렬이 'data.frame'에 전달되면 각 구성 요소 또는 열이 별도의 인수로 전달 된 것처럼 보입니다 ( ' "model.matrix"'클래스의 행렬 과 'I로 보호되는 행렬 제외). ' ).

(강조 추가).

그래서

data.frame(a=1:3,b=I(list(1,1:2,1:3)))

작동하는 것 같습니다.


17
관심있는 사람들에게 "I"는 "객체의 상호 작용 / 변환 금지"를 의미합니다. 동일한 객체를 생성하지만 클래스 집합에 "AsIs"가 추가됩니다. "AsIs"클래스는 실제로 data.frame () 및 formula () 함수로 읽을 수 있습니다. 여기에서 자세히 알아보십시오 .
pwilcox

2
놀랍습니다. 솔루션에 감사드립니다. 하지만 단지 I금지 Interperetation은 / 객체의 변환이 : 조금 너무 짧은 것 같다 위해
sertsedat

@pwilcox 매우 흥미 롭습니다. 내가 보호하고 있는지 이해하기 위해 객체를 호출하는 방법이 있습니까? 나는 그것이 class()? 예 I(iris) -> i; i %>% class() 3 [1] "AsIs" "data.frame"(AsI 클래스 반환)
stevec

33

을 (를) 사용하는 경우 data.tables다음 전화를 피할 수 있습니다.I()

library(data.table)
# the following works as intended
data.table(a=1:3,b=list(1,1:2,1:3))

   a     b
1: 1     1
2: 2   1,2
3: 3 1,2,3

이것은 data.table넓은 마진 에 의해 과소 평가 된 기능입니다
data princess

22

data_frameS (다양 호출은 tibbles, tbl_df, tbl)에서 기본적으로 사용하는 컬럼의 생성 지원 data_frame생성자를. 이를 사용하려면 tibble, dplyr또는 tidyverse.

> data_frame(abc = letters[1:3], lst = list(1:3, 1:3, 1:3))
# A tibble: 3 × 2
    abc       lst
  <chr>    <list>
1     a <int [3]>
2     b <int [3]>
3     c <int [3]>

그들은 실제로 data.frames후드 아래에 있지만 다소 수정되었습니다. 거의 항상 정상적으로 사용할 수 있습니다 data.frames. 내가 찾은 유일한 예외는 사람들이 부적절한 수업 검사를 할 때 문제를 일으킨다는 것입니다.

> #no problem
> data.frame(x = 1:3, y = 1:3) %>% class
[1] "data.frame"
> data.frame(x = 1:3, y = 1:3) %>% class == "data.frame"
[1] TRUE
> #uh oh
> data_frame(x = 1:3, y = 1:3) %>% class
[1] "tbl_df"     "tbl"        "data.frame"
> data_frame(x = 1:3, y = 1:3) %>% class == "data.frame"
[1] FALSE FALSE  TRUE
> #dont use if with improper testing!
> if(data_frame(x = 1:3, y = 1:3) %>% class == "data.frame") "something"
Warning message:
In if (data_frame(x = 1:3, y = 1:3) %>% class == "data.frame") "something" :
  the condition has length > 1 and only the first element will be used
> #proper
> data_frame(x = 1:3, y = 1:3) %>% inherits("data.frame")
[1] TRUE

R 4 Data Science (무료) 에서 이에 대해 읽어 볼 것을 권장합니다 .


1
R은 움직이고 성장하고 있으며 이것이 질문에 대한 2018 년 답이라고 생각하며 어떻게 든 그렇게 표시되어야합니다.
Fitzroy Hogsflesh

충분히 인기가 있다면 정상에 올 것입니다. 우리 중 많은 사람들이 여전히 기본 R을 사용합니다.
Ben Bolker
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.