Nó chắc chắn cảm thấy như có phải là một giải pháp cơ sở R để này, nhưng tốt nhất tôi có thể làm là với tidyr
, trước tiên chuyển đổi dữ liệu ở dạng rộng, sau đó lọc chỉ những quan sát phù hợp với khóa mong muốn.
data %>%
add_rownames("index") %>%
gather(var, value, -index, -key) %>%
filter(key == var)
Một giải pháp R cơ sở mà hầu hết các công trình:
data[cbind(seq_along(data$key), data$key)]
Đối với các dữ liệu nhất định, nó không hoạt động, nhưng bởi vì nó sử dụng một ma trận, nó có hai vấn đề nghiêm trọng. Một là thứ tự của yếu tố quan trọng, bởi vì nó chỉ co giật mà ra, và chọn cột theo cấp độ yếu tố, không phải bởi tên cột. Cách khác là kết quả đầu ra là character
, không phải là numeric
, bởi vì trong chuyển đổi thành ma trận, loại character
được chọn vì cột key
. Vấn đề chính là không có tương tự data.frame
với hành vi ma trận của
Khi lập chỉ mục mảng bằng '[' một đối số 'i' có thể là ma trận với nhiều cột có kích thước 'x' ; kết quả sau đó là một vectơ với các phần tử tương ứng với các tập hợp các chỉ số trong mỗi hàng của 'i'.
Vì những vấn đề này, tôi có thể đi với giải pháp tidyr
, vì thực tế là các cột có thể lựa chọn có nghĩa là chúng có thể đại diện cho các quan sát khác nhau cho cùng một đơn vị quan sát được.
Bạn cũng có thể thử 'dữ liệu [c (" x "," y "," z ")] [cbind (seq_len (nrow (dữ liệu)), khớp (dữ liệu $ key, tên (dữ liệu))) ] 'để tránh nhóm theo từng hàng (với, có lẽ thấp hơn, chi phí của một chuyển đổi trung gian thành" ma trận "). –
@alexis_laz Tôi thích một cách tiếp cận mở rộng hơn mà không yêu cầu liệt kê mọi cột. – sharoz
Tùy thuộc vào cách các cột của bạn được sắp xếp, cần có nhiều cách để lập trình chương trình giải nén các cột cần thiết; 'dữ liệu [1: 3]', 'dữ liệu [duy nhất (dữ liệu $ key)]', 'dữ liệu [! tên (dữ liệu)% trong%" khóa "]' etc –