2013-08-04 30 views
5

Tôi đang xóa một số tệp excel trong R. Rất tiếc, chúng có kích thước không bằng nhau, hàng và cột. Hiện tại tôi đang lưu trữ từng bảng excel dưới dạng một khung dữ liệu trong một danh sách. Tôi biết làm thế nào để in hàng thứ 4 của khung dữ liệu đầu tiên trong danh sách bằng cách phát hành lệnh này:In hàng thứ N trong danh sách khung dữ liệu

df.list1[[1]][4,] 

Hoặc một loạt các dòng như thế này:

df.list1[[1]][1:10,] 

Câu hỏi của tôi là: Làm thế nào để in một hàng cụ thể cho mọi khung dữ liệu trong danh sách? Nói cách khác:

df.list1[[i]][4,] 

df.list1 có 30 khung hình dữ liệu trong nó, nhưng khác df.lists tôi có hơn 140 khung dữ liệu mà tôi đang tìm cách để giải nén hàng của họ. Tôi muốn có thể lưu trữ các vị trí cụ thể trên nhiều khung dữ liệu vào một danh sách mới. Tôi nghĩ giải pháp có thể liên quan đến lapply.

Hơn nữa, có cách nào trích xuất các hàng trong mọi khung dữ liệu trong danh sách dựa trên điều kiện không? Ví dụ: đối với tất cả 30 khung dữ liệu trong danh sách df.list1, hãy trích xuất hàng nếu giá trị bằng "Căn hộ" hoặc một số chuỗi ký tự khác.

Đánh giá cao sự trợ giúp của bạn, vui lòng cho tôi biết nếu tôi có thể giúp làm rõ vấn đề của tôi.

Trả lời

12

Bạn cũng có thể chỉ trực tiếp lapply chức năng khai thác @Justin gợi ý, ví dụ:

# example data of a list containing 10 data frames: 
test <- replicate(10,data.frame(a=1:10),simplify=FALSE) 

# extract the fourth row of each one - setting drop=FALSE means you get a 
# data frame returned even if only one vector/column needs to be returned. 
lapply(test,"[",4,,drop=FALSE) 

Định dạng là:

lapply(listname,"[",rows.to.return,cols.to.return,drop=FALSE) 

# the example returns the fourth row only from each data frame 
#[[1]] 
# a 
#4 4 
# 
#[[2]] 
# a 
#4 4 
# etc... 

Để khái quát hóa điều này khi bạn hoàn thành việc trích xuất dựa trên điều kiện, bạn sẽ phải thay đổi một chút thành ví dụ dưới đây, giải nén tất cả các hàng nơi a trong mỗi data.frame>4. Trong trường hợp này, sử dụng anonymous function có lẽ là phương pháp rõ ràng nhất, ví dụ::

lapply(test, function(x) with(x,x[a>4,,drop=FALSE])) 

#[[1]] 
# a 
#5 5 
#6 6 
#7 7 
#8 8 
#9 9 
#10 10 
# etc... 
+0

Rất hữu ích! Tôi đã sử dụng phương pháp này trong một vài ngày, nhưng bạn có thể chỉ cho tôi một ví dụ về việc trích xuất một hàng dựa trên một điều kiện không? điều này là sai, nhưng bạn vẫn có thể nhận được ý tưởng: lapply (test, "[", if (row = "Apartment") ,, drop = FALSE) – geoQuant

+0

@geoQuant - Tôi đã chỉnh sửa câu trả lời của tôi để bao gồm điều này - hy vọng nó sẽ giúp . – thelatemail

+0

'lapply (kiểm tra, tập hợp con, a> 4)' làm phương án thay thế – baptiste

4

Đề nghị của tôi là viết một hàm mà những gì bạn muốn trên một khung dữ liệu duy nhất:

myfun <- function(dat) { 
    return(dat[4, , drop=FALSE]) 
} 

Nếu bạn muốn quay trở lại như một vector thay vì data.frame, chỉ cần làm: return(dat[4, ]) insteaad. Sau đó sử dụng lapply để áp dụng chức năng đó để mỗi phần tử của danh sách của bạn:

lapply(df.list1, myfun) 

Với kỹ thuật này, bạn có thể dễ dàng đưa ra cách để mở rộng myfun chức năng phức tạp hơn ...

+0

Cách tiếp cận thú vị. Cảm ơn bạn, nhưng tôi dường như không thể chạy myFun. – geoQuant

+0

@geoQuant, đó là một sự giám sát nhỏ. Nó sẽ ổn thôi. – Arun

5

Không cần cho một chức năng bao bọc, chỉ cần sử dụng lapplyvượt qua nó một đối số trống vào cuối (để đại diện cho các cột)

lapply(df.list, `[`, 4,) 

này cũng làm việc với bất kỳ loại đối số hàng nào mà bạn thường sử dụng trong myDF[ . , ] ví dụ: lapply(df.list, [, c(2, 4:6),)

.


tôi sẽ đề nghị rằng nếu bạn đang sử dụng một chức năng bao bọc, có cho nó hoạt động giống như [ không: ví dụ

Grab(df.list, 2:3, 1:5) sẽ chọn thứ hai & hàng thứ ba và lần đầu tiên thông qua cột thứ 5 của mỗi data.frame và Grab (df.list, 2:3) sẽ chọn thứ hai & hàng thứ ba của tất cả các cột

Grab <- function(ll, rows, cols) { 
    if (missing(cols)) 
     lapply(ll, `[`, rows,) 
    else 
     lapply(ll, `[`, rows, cols) 
} 

Grab (df.list, 2:3) 
0

Ví dụ, bạn có một tập tin .csv gọi hw1_data.csv và bạn muốn lấy hàng thứ 47. Dưới đây là cách thực hiện:

x<-read.csv("hw1_data.csv") 

x[47,] 

Nếu đó là tệp văn bản bạn có thể sử dụng read.table.