2012-10-25 72 views
11

Tôi có khung dữ liệu như thế này:Tìm chỉ số của cột trong khung dữ liệu có chứa các chuỗi như giá trị

df <- data.frame(col1 = c(letters[1:4],"a"),col2 = 1:5,col3 = letters[10:14]) 
df 
    col1 col2 col3 
1 a 1 j 
2 b 2 k 
3 c 3 l 
4 d 4 m 
5 a 5 n 

Tôi muốn tìm chỉ số của cột của df có giá trị phù hợp với chuỗi " một ". tức là nó sẽ cho tôi kết quả là 1. Tôi đã thử sử dụng nó một cách dễ dàng nhưng không hoạt động. Bất kỳ ai cũng biết làm thế nào để làm điều đó mà không có một vòng lặp ??

Trả lời

13

Một cái gì đó như thế này?

which(apply(df, 2, function(x) any(grepl("a", x)))) 

Các bước thực hiện:

  1. Với apply đi qua mỗi cột
  2. tìm kiếm nếu a là trong cột này với grepl
  3. Kể từ khi chúng tôi nhận được một vector trở lại, sử dụng any để có được TRUE nếu bất kỳ phần tử nào đã được đối sánh với a
  4. Cuối cùng, hãy kiểm tra which yếu tố (cột) là TRUE (tức là chứa thư được tìm kiếm a).
+0

Cảm ơn rất nhiều @jmsigner. – user1021713

3

Kể từ khi bạn đề cập đến bạn đã cố gắng sử dụng sapply() nhưng đã không thành công, dưới đây là cách bạn có thể làm điều đó:

> sapply(df, function(x) any(x == "a")) 
col1 col2 col3 
TRUE FALSE FALSE 
> which(sapply(df, function(x) any(x == "a"))) 
col1 
    1 

Tất nhiên, bạn cũng có thể sử dụng phương pháp grep()/grepl() nếu bạn thích hợp chuỗi . Bạn cũng có thể quấn chức năng which() với unname() nếu bạn muốn chỉ số cột.

+0

Cảm ơn rất nhiều vì giải pháp này cũng ... – user1021713

Các vấn đề liên quan