Saya telah mencoba mencari cara untuk menetapkan nilai berdasarkan beberapa kriteria.

Saya memiliki kumpulan data yang secara sederhana terlihat seperti:

fish <- data.frame ("method"=c("cryptic", "cryptic", "cryptic", 
                               "quad", "quad", "quad", 
                               "fish", 
                               "1mquad", "1mquad"),
                    "species"= c("A", "B", "C", 
                                 "A", "B", "D", 
                                 "A",
                                 "A", "B"), 
                  "cut"=1)

Saya ingin mengubah nilai cut menjadi 0 jika suatu spesies memiliki metode cryptic dan quad atau cryptic dan 1mquad.

Saya sudah mencoba beberapa hal yang berbeda dan terus macet. Ketika saya melakukan pernyataan if saya mendapat peringatan aneh. Beberapa hal yang saya coba adalah membuat subset df hanya dengan samar

cryptic <- fish [fish$method == "cryptic",]

Dan kemudian mencoba untuk membuat subset

fish$cut [match(fish$species, cryptic$species) & fish$method =="quad"] <- 0
fish$cut [match(fish$species, cryptic$species) & fish$method =="1mquad"] <- 0

Tapi itu tidak berhasil. Saya juga mencoba membuat kondisi:

cond3 <- fish$species %in% intersect(fish$species, cryptic$species)
cond4 <- fish$method %in% c ("1mquad", "quad", "cryptic")

Dan melakukan pernyataan if dengan itu, tetapi tidak berhasil. Juga, saya memiliki beberapa kondisi lain sebelum perubahan dipotong ke 0, jadi saya tidak dapat menggunakan pernyataan ifelse karena menimpa kondisi lain tersebut. Ada saran?

0
Ally D 17 November 2017, 04:46

1 menjawab

Jawaban Terbaik

Anda cukup dekat dengan kondisinya. Berikut cara yang disesuaikan:

crypt = unique(fish$species[fish$method == "cryptic"])
quad = unique(fish$species[fish$method %in% c("quad", "1mquad")])
to_change = intersect(crypt, quad)
fish$cut = ifelse(fish$species %in% to_change, 0, fish$cut)
fish
#    method species cut
# 1 cryptic       A   0
# 2 cryptic       B   0
# 3 cryptic       C   1
# 4    quad       A   0
# 5    quad       B   0
# 6    quad       D   1
# 7    fish       A   0
# 8  1mquad       A   0
# 9  1mquad       B   0

Menggunakan pernyataan ifelse dengan fish$cut sebagai "lain" berarti bahwa jika kondisi tidak terpenuhi, apa pun yang ada akan tetap di sana.

Demo

1
Tim Biegeleisen 17 November 2017, 02:00