簡體   English   中英

R:對多個列進行突變以創建新列

[英]R: mutate over multiple columns to create a new column

我正在嘗試根據其他列的值創建一個新列。

這是一個與我正在處理的數據集相似的數據集。 我有三個變量,Test1,Test2,Test3。 我試圖創建一個新變量,如果任何測試變量是DF60,DF61,DF63或DF64,則為1,否則為0。

Test1<-c("DF64", "DF63", "DF89", "DF30", "DF70")
Test2<-c("DF61", "DF25", "DF00", "DF30", "DF99")
Test3<-c("DF80", "DF63", "DF60", "DF63", "DF70")
Test<-data.frame(Test1, Test2, Test3)

目前,我有許多ifelse語句,並且正在尋找一個可以在多個Test變量上循環的同時允許查找多個值的代碼。

在瀏覽了一些類似的線程之后,我嘗試了mutate_at,但是我認為這不是正確的方法。

Test2<- Test %>%
mutate_at(vars(starts_with("Test")), funs(Test=ifelse("DF60" | "DF61" | 
"DF62" | "DF63", 1, 0)))

任何幫助深表感謝!

謝謝!

Test2<- Test %>%
dplyr::select(starts_with("Test"))%>%
mutate_all(function(x){x %in% c("DF60","DF61","DF62","DF63")})%>%
mutate(out = ifelse(rowSums(.)<1,0,1))

評論后的調整

如果要保留其他列,則yutannihilation提議的mutate_at會更好。 然后,問題就變成了在選擇列時對rowums進行突變。 不知道下一件事是否是最佳實踐,但它能奏效(對我的上一個問題的答案進行了重新設計: dplyr對列子集進行mutate(所有這些列上的一個函數組合)

library(tidyverse)
library(anomalyDetection)

Test1<-c("DF64", "DF63", "DF89", "DF30", "DF70")
Test2<-c("DF61", "DF25", "DF00", "DF30", "DF99")
Test3<-c("DF80", "DF63", "DF60", "DF63", "DF70")
Test<-data.frame(Test1, Test2, Test3)

Test$ExtraCol<-LETTERS[1:5]


Test2<- Test %>%
  mutate_at(vars(starts_with("Test")),funs(bin=.%in% c("DF60","DF61","DF62","DF63")))%>%
  split(.,1<10)%>%
  map_df(~mutate(.,out=rowSums(.[paste0("Test",1:3,"_bin")])>0))


  Test1 Test2 Test3 ExtraCol Test1_bin Test2_bin Test3_bin   out
   DF64  DF61  DF80        A     FALSE      TRUE     FALSE  TRUE
   DF63  DF25  DF63        B      TRUE     FALSE      TRUE  TRUE
   DF89  DF00  DF60        C     FALSE     FALSE      TRUE  TRUE
   DF30  DF30  DF63        D     FALSE     FALSE      TRUE  TRUE
   DF70  DF99  DF70        E     FALSE     FALSE     FALSE FALSE

盡管Dries的答案足夠好,但讓我添加一些有關funs()解釋。

funs()后綴和表達式對。 例如,如果指定suffix1suffix2 ,則將獲得名為Test1_suffix1Test1_suffix2Test2_suffix1Test2_suffix2新列,依此類推:

funs(suffix1 = ..., suffix2 = ...)

其次,您需要. 代表列向量。 因此, ifelse(...)的正確版本應為:

Test %>%
  mutate_at(vars(starts_with("Test")),
            funs(bin = ifelse(. == "DF60" | . == "DF61" | . == "DF62" | . == "DF63", 1, 0)))
#>   Test1 Test2 Test3 Test1_bin Test2_bin Test3_bin
#> 1  DF64  DF61  DF80         0         1         0
#> 2  DF63  DF25  DF63         1         0         1
#> 3  DF89  DF00  DF60         0         0         1
#> 4  DF30  DF30  DF63         0         0         1
#> 5  DF70  DF99  DF70         0         0         0

顯然, %in%優於|順序

Test %>%
  mutate_at(vars(starts_with("Test")),
            funs(bin = ifelse(. %in% c("DF60", "DF61", "DF62", "DF63"), 1, 0)))
#>   Test1 Test2 Test3 Test1_bin Test2_bin Test3_bin
#> 1  DF64  DF61  DF80         0         1         0
#> 2  DF63  DF25  DF63         1         0         1
#> 3  DF89  DF00  DF60         0         0         1
#> 4  DF30  DF30  DF63         0         0         1
#> 5  DF70  DF99  DF70         0         0         0

如果只想過濾,則可以使用filter_at()

Test %>%
  filter_at(vars(starts_with("Test")),
            any_vars(. %in% c("DF60", "DF61", "DF62", "DF63")))
#>   Test1 Test2 Test3
#> 1  DF64  DF61  DF80
#> 2  DF63  DF25  DF63
#> 3  DF89  DF00  DF60
#> 4  DF30  DF30  DF63

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM