Tôi đang cố gắng hiểu cách thay thế giá trị có điều kiện trong một khung dữ liệu mà không cần sử dụng vòng lặp. khung dữ liệu của tôi được cấu trúc như sau:Thay thế giá trị có điều kiện trong một data.frame
> df
a b est
1 11.77000 2 0
2 10.90000 3 0
3 10.32000 2 0
4 10.96000 0 0
5 9.90600 0 0
6 10.70000 0 0
7 11.43000 1 0
8 11.41000 2 0
9 10.48512 4 0
10 11.19000 0 0
và dput
đầu ra là thế này:
structure(list(a = c(11.77, 10.9, 10.32, 10.96, 9.906, 10.7,
11.43, 11.41, 10.48512, 11.19), b = c(2, 3, 2, 0, 0, 0, 1, 2,
4, 0), est = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), .Names = c("a",
"b", "est"), row.names = c(NA, -10L), class = "data.frame")
Những gì tôi muốn làm, là để kiểm tra giá trị của b
. Nếu b
là 0, tôi muốn đặt est
thành giá trị từ a
. Tôi hiểu rằng df$est[df$b == 0] <- 23
sẽ đặt tất cả các giá trị của est
thành 23, khi b==0
. Điều tôi không hiểu là cách đặt est
thành giá trị a
khi điều kiện đó là đúng. Ví dụ:
df$est[df$b == 0] <- (df$a - 5)/2.533
đưa ra cảnh báo sau đây:
Warning message:
In df$est[df$b == 0] <- (df$a - 5)/2.533 :
number of items to replace is not a multiple of replacement length
Có cách nào mà tôi có thể vượt qua các tế bào có liên quan, chứ không phải là vector?
này xứng đáng một upvote nếu bạn lần đầu tiên thêm hoặc là một liên kết đến R-Inferno trang hoặc tóm tắt các vấn đề với '$' (hoặc lý tưởng là cả hai). – Andrie
+1 Mặc dù tôi nghĩ toán tử '$' hoàn toàn ổn trong trường hợp này. (Ngoài ra, tôi lưu ý rằng mặc dù cảnh báo bạn sử dụng '$' chính mình ...) – Andrie
@Andrie: vâng, tôi đã sử dụng nó ở nơi nó hoạt động (không phải đó là rất nhiều trợ giúp :-)). OP đã cố gắng sử dụng nó để xác định những yếu tố nào đang được thực hiện, đó là nơi mà sự cố đã bắt đầu. Tôi chỉ sử dụng nó để xác định một điều kiện đã chọn các phần tử dataframe. Nhưng bạn biết rằng :-) –