2012-03-29 40 views
34

Tôi đang cố thu thập một số dữ liệu từ nhiều tập hợp con của tập dữ liệu và cần tạo khung dữ liệu để thu thập kết quả. Vấn đề của tôi là không biết làm thế nào để tạo ra một khung dữ liệu rỗng với số cột được xác định mà không thực sự có dữ liệu để đưa vào nó.R xác định kích thước của khung dữ liệu trống

collect1 <- c() ## i'd like to create empty df w/ 3 columns: `id`, `max1` and `min1` 

for(i in 1:10){ 
collect1$id <- i 
ss1 <- subset(df1, df1$id == i) 
collect1$max1 <- max(ss1$value) 
collect1$min1 <- min(ss1$value) 
} 

tôi cảm thấy rất ngớ ngẩn hỏi câu hỏi này (tôi gần như cảm thấy như tôi đã hỏi nó trên SO trước nhưng không thể tìm thấy nó) nhưng rất nhiều sẽ đánh giá cao sự giúp đỡ nào.

+0

chưa được kiểm tra, nhưng đây là hit đầu tiên từ Google, trông giống như câu trả lời từ @Gabor nên làm việc: http: //r.789695.n4 .nabble.com /Empty-data-frame-td846772.html – Chase

Trả lời

21

Chỉ cần tạo một khung dữ liệu vectơ rỗng:

collect1 <- data.frame(id = character(0), max1 = numeric(0), max2 = numeric(0)) 

Nhưng nếu bạn biết có bao nhiêu hàng bạn sẽ có trước, bạn chỉ nên tạo ra các khung dữ liệu với nhiều hàng để bắt đầu với.

+3

Tôi thường sử dụng NA: 'data.frame (a = NA, b = NA, C = NA)'. –

+4

Nhưng điều đó không tạo ra một khung dữ liệu trống: đó là một khung dữ liệu một hàng xảy ra là tất cả các giá trị bị thiếu. –

+0

Đúng, nhưng trong phòng thủ của tôi, người ta có thể bỏ qua bài viết hàng đầu tiên. :) Sẽ rất thú vị để xem mục đích đằng sau vấn đề của OP là gì. Tôi nghĩ rằng mọi thứ có thể được giải quyết bằng cách áp dụng và do.call. –

11

Bạn có thể làm một cái gì đó như:

N <- 10 
collect1 <- data.frame(id = integer(N), 
         max1 = numeric(N), 
         min1 = numeric(N)) 

Bây giờ hãy cẩn thận rằng trong phần còn lại của mã của bạn, bạn quên sử dụng các chỉ số hàng cho điền hàng data.frame bởi hàng. Nó phải là:

for(i in seq_len(N)){ 
    collect1$id[i] <- i 
    ss1 <- subset(df1, df1$id == i) 
    collect1$max1[i] <- max(ss1$value) 
    collect1$min1[i] <- min(ss1$value) 
} 

Cuối cùng, tôi có nhiều lựa chọn thay thế để làm những gì bạn đang cố gắng hoàn thành, một số sẽ hiệu quả hơn và sử dụng ít gõ hơn. Ví dụ, bạn có thể xem hàm aggregate hoặc ddply từ gói plyr.

85

Một khung dữ liệu của công việc NA có hoạt động không? cái gì đó như:

data.frame(matrix(NA, nrow = 2, ncol = 3))

nếu bạn cần phải cụ thể hơn về các kiểu dữ liệu sau đó có thể thích: NA_integer_, NA_real_, NA_complex_, hoặc NA_character_ thay vì chỉ NA đó là logic

Cái gì khác mà có thể cụ thể hơn là NAs là:

data.frame(matrix(vector(mode = 'numeric',length = 6), nrow = 2, ncol = 3))

trong đó chế độ có thể thuộc bất kỳ loại nào. Xem ?vector

+2

Đây là cách tôi thường làm. – Hansi

2

Nó có thể giúp các giải pháp được đưa ra trong diễn đàn khác, Về cơ bản là: ví dụ:

Cols <- paste("A", 1:5, sep="") 
DF <- read.table(textConnection(""), col.names = Cols,colClasses = "character") 

> str(DF) 
'data.frame': 0 obs. of 5 variables: 
$ A1: chr 
$ A2: chr 
$ A3: chr 
$ A4: chr 
$ A5: chr 

Bạn có thể thay đổi để phù hợp với colClasses nhu cầu của bạn.

gốc liên kết là https://stat.ethz.ch/pipermail/r-help/2008-August/169966.html

7

Bạn có thể sử dụng NULL thay vì NA. Điều này tạo ra một khung dữ liệu thật sự trống.

+0

Đây là câu trả lời đơn giản nhất. Nó vẫn còn bất khả tri về kiểu dữ liệu của cột, và nó không tạo ra một hàng đầu tiên theo mặc định như một số câu trả lời khác làm. – rsoren

+0

Ý của bạn là NULL trong ma trận(). Có lỗi trong ma trận (NULL, nrow = 0, ncol = 3): 'dữ liệu' phải thuộc loại véc tơ, là 'NULL' –

1

Một phương pháp tổng quát hơn để tạo khung dữ liệu kích thước tùy ý là tạo khung dữ liệu n-by-1 từ ma trận có cùng thứ nguyên.Sau đó, bạn ngay lập tức có thể thả hàng đầu tiên:

> v <- data.frame(matrix(NA, nrow=1, ncol=10)) 
> v <- v[-1, , drop=FALSE] 
> v 
[1] X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 
<0 rows> (or 0-length row.names) 
+4

Thay vì thả hàng đầu tiên, bạn có thể tạo ma trận với 'nrow = 0 ' – ping

5
df = data.frame(matrix("", ncol = 3, nrow = 10) 
+1

sử dụng tốt hơn" NA "thay vì" "trong khi tạo df. nếu không thì tất cả các cột đều là một Factor với một mức. – Jens

+0

Giải pháp tuyệt vời, nhưng bỏ lỡ một kết thúc phụ ')'. Và như tôi thực sự không thích các yếu tố, tôi sử dụng tibbles: 'dplyr :: as_tibble (ma trận (NA, ncol = 3, nrow = 10))'. Bạn có thể sử dụng 'NA_character_' và' NA_integer' vv để buộc loại dữ liệu. –

0

Nếu chỉ các tên cột có sẵn như:

cnms <- c("Nam1","Nam2","Nam3") 

Để tạo một khung dữ liệu trống với tên biến trên, đầu tiên tạo một đối tượng data.frame:

emptydf <- data.frame() 

Bây giờ gọi thành phần zeroth của mỗi cột, do đó tạo khung dữ liệu trống tên biến đưa ra:

for(i in 1:length(cnms)){ 
    emptydf[0,eval(cnms[i])] 
} 
0

seq_along có thể giúp tìm ra bao nhiêu hàng trong tệp dữ liệu của bạn và tạo ra một data.frame với số lượng mong muốn của hàng

listdf <- data.frame(ID=seq_along(df), 
           var1=seq_along(df), var2=seq_along(df)) 
0

Dưới đây là một giải pháp nếu bạn muốn một khung dữ liệu rỗng với một số định nghĩa các hàng và cột NO:

df = data.frame(matrix(NA, ncol=1, nrow=10)[-1] 
Các vấn đề liên quan