Tôi đã vi phạm đầu của mình về việc dịch this question thành giải pháp data.table
. (Để đơn giản, tôi sẽ sử dụng cùng một tập dữ liệu)
Khi V2 == "b
Tôi muốn hoán đổi các cột giữa V1 <-> V3
.Trao đổi giá trị giữa hai cột bằng cách sử dụng data.table
dt <- data.table(V1=c(1,2,4), V2=c("a","a","b"), V3=c(2,3,1))
#V1 V2 V3
#1: 1 a 2
#2: 2 a 3
#3: 4 b 1
Đoạn code dưới đây sẽ là giải pháp làm việc cho data.frame
, tuy nhiên vì số lượng của sự thất vọng này đã cho tôi vì tôi đã sử dụng một data.table
mà không nhận ra Tôi bây giờ cố gắng tìm ra một giải pháp cho data.table .
dt <- data.table(V1=c(1,2,4), V2=c("a","a","b"), V3=c(2,3,1))
df <- as.data.frame(dt)
df[df$V2 == "b", c("V1", "V3")] <- df[df$V2 == "b", c("V3", "V1")]
# V1 V2 V3
#1 1 a 2
#2 2 a 3
#3 1 b 4
Tôi đã thử viết một hàm lapply
Looping qua danh sách trao đổi mục tiêu của tôi, cố gắng để thu hẹp vấn đề để chỉ thay thế một giá trị, cố gắng gọi tên cột theo những cách khác nhau nhưng tất cả đều không thành công.
Đây là nỗ lực gần nhất tôi đã quản lý để có được:
> dt[dt$V2 == "b", c("V1", "V3")] <- dt[dt$V2 == "b", c(V3, V1)]
#Warning messages:
#1: In `[<-.data.table`(`*tmp*`, dt$V2 == "b", c("V1", "V3"), value = c(1, :
# Supplied 2 items to be assigned to 1 items of column 'V1' (1 unused)
#2: In `[<-.data.table`(`*tmp*`, dt$V2 == "b", c("V1", "V3"), value = c(1, :
# Supplied 2 items to be assigned to 1 items of column 'V3' (1 unused)
Làm thế nào chúng ta có thể có được giải pháp data.table?
Tôi đoán sử dụng '.SD' nhanh hơn đi 'danh sách (V1, V3) '? – BenBarnes
@BenBarnes Tôi đã không kiểm tra xem nó sẽ nhanh hơn, trông giống như 'danh sách (V1, V3)' sẽ là tốt quá. – akrun
@eddi, những gì bạn có chống lại '.SDcols'? Tôi nghĩ rằng đó là giải pháp mạnh mẽ hơn trong trường hợp bạn có một vector của các cột được xác định trước. –