2015-04-23 22 views
9

dplyr'da bir satır alt kümesini mutasyona sokmakta güçlük çekiyorum. Ben zincirleme komutu kullanıyorum: %>% söylemek:R Satırların bir alt kümesi nasıl değiştirilir

data <- data %>% 
    filter(ColA == "ABC") %>% 
    mutate(ColB = "XXXX") 

Bu iyi çalışır ama sorunlar ı tüm orijinal tabloyu seçmek mümkün istiyorum ve ben vardı verilerin sadece alt sisteminin mutasyona bkz belirtildi. Benim sorunum, bundan sonra verileri görüntülediğimde, sadece data alt kümesini ve güncelleştirilmiş ColB bilgisini görmem.

data.table'u kullanarak bunu nasıl yapacağımı bilmek isterim.

Teşekkürler.

cevap

9

data.table kullanarak, yapardım.

Bu alt dizisine başvurusunu referans olarak atarız. Bu konuda daha fazla bilgi edinmek için new HTML vignettes.

+0

Teşekkür ederiz. Bu çalıştı. Ve nasıl bir mulitple kriter filtresi yaparım? Aşağıdakileri denedim ama doğru sözdizimi gibi görünmüyor.'setDT (veri) [(colA == "ABC") & (colC == "DEF"), ColB: = "XXXX"] ' –

+0

@ user1991118 bu * doğru * sözdizimi - belki de tekrarlanabilir bir örnek gösterebilirsiniz. Düşünebildiğim tek şey, '' 'yerine' '' kullanmak demek. – eddi

+0

Bu gerçekten doğru sözdizimi idi. Yanlış değişkeni kullandım. Çalışıyor. –

4

filter()'u kullandığınızda, belirttiğiniz koşulla uyuşmayan satırları kaldırırsınız, böylece son veri kümesinde görünmezler.

ColB veri çerçevenizde zaten var mı?

data %>% 
    mutate(ColB = ifelse(ColA == "ABC", "XXXX", ColB)) 

ColB "XXXX" ne zaman ColA == "ABC" değiştirip başka türlü olduğu gibi bırakabilirsiniz, böylece edin. ColB zaten mevcut değilse, o zaman örneğin, satırlar ColA != "ABC" için ne yapacağını belirtmek gerekir:

data %>% 
    mutate(ColB = ifelse(ColA == "ABC", "XXXX", NA)) 
0

Diğer bir seçenek birlik ve aynı verilerle karşıtı katılmak bir sonraki birleşimini yapmaktır.

data <- data %>% 
    filter(ColA == "ABC") %>% 
    mutate(ColB = "XXXX") %>% 
    rbind_list(., anti_join(data, ., by = ...)) 

Örnek:

mtcars_n <- mtcars %>% add_rownames 
mtcars_n %>% 
    filter(cyl > 6) %>% 
    mutate(mpg = 1) %>% 
    rbind_list(., anti_join(mtcars_n, ., by = "rowname")) 

Bu mevcut boru uzatarak hızlı sonuç almak çok muhtemelen başka bir yaklaşım daha yavaş, ama yararlı olan bu birincil anahtar gerektirir.

setDT(data)[colA == "ABC", ColB := "XXXX"] 

ve değerler tüm sütunu nerede durum tatmin sadece bu satırları yerine kopyalamak which'd if-else, aksine yerindedeğiştirilir:

İlgili konular