2015-06-04 28 views
5

tôi có 2 đối tượng:Áp dụng chức năng để dataframe với thay đổi lập luận

Một khung dữ liệu với 3 biến:

v1 <- 1:10 
v2 <- 11:20 
v3 <- 21:30 
df <- data.frame(v1,v2,v3) 

Một vector số với 3 yếu tố:

nv <- c(6,11,28) 

Tôi muốn để so sánh biến đầu tiên với số đầu tiên, biến thứ hai với số thứ hai và cứ như vậy.

which(df$v1 > nv[1]) 
which(df$v2 > nv[2]) 
which(df$v3 > nv[3]) 

Tất nhiên trong thực tế, khung dữ liệu của tôi có thể nhập từng biến không phải là một tùy chọn.

Tôi gặp phải các vấn đề này khá thường xuyên. Tôi cần đọc loại tài liệu nào để thông thạo những vấn đề này?

Trả lời

8

Một tùy chọn sẽ là so sánh với các yếu tố có kích thước bằng nhau. Đối với điều này, chúng ta có thể tái tạo các phần tử trong 'nv' theo từng hàng của 'df' (rep(nv, each=nrow(df))) và so sánh với df hoặc sử dụng chức năng col có kết quả tương tự như rep.

which(df > nv[col(df)], arr.ind=TRUE) 

Nếu bạn cần một ma trận logic tương ứng với so sánh của từng cột với mỗi phần tử của 'nv'

sweep(df, 2, nv, FUN='>') 
+1

Thanks a lot. Tất cả những câu trả lời này đều là những câu trả lời tuyệt vời. – 1053Inator

3

Tôi nghĩ rằng những loại tình huống khó khăn vì các giải pháp looping bình thường (ví dụ như apply chức năng) chỉ lặp qua một đối tượng, nhưng bạn cần lặp lại cả hai thông qua dfnv cùng một lúc. Một cách tiếp cận là lặp qua các chỉ mục và sử dụng chúng để lấy thông tin thích hợp từ cả hai số dfnv. Một cách thuận tiện để lặp qua các chỉ số là sapply chức năng:

sapply(seq_along(nv), function(x) which(df[,x] > nv[x])) 
# [[1]] 
# [1] 7 8 9 10 
# 
# [[2]] 
# [1] 2 3 4 5 6 7 8 9 10 
# 
# [[3]] 
# [1] 9 10 
4

Bạn cũng có thể sử dụng mapply:

mapply(FUN=function(x, y)which(x > y), x=df, y=nv) 
#$v1 
#[1] 7 8 9 10 
# 
#$v2 
#[1] 2 3 4 5 6 7 8 9 10 
# 
#$v3 
#[1] 9 10 
Các vấn đề liên quan