我在一個資料集中有一個來自不同來源的名稱串列:一組由 FirstName LastName 組織;另一個有全名。我想查看名字或姓氏是否在全名列中,并創建一個標志。兩個問題:
首先,我使用了這個解決方案,但是生成的資料沒有正確的行數,我不知道如何讓它做一個標志。我試圖把它變成一個 ifelse 陳述句,但又遇到了另一個錯誤。我該如何解決這個問題,如果 FirstName 在 FullName 中,我標記 True(或 1),否則標記 False(或 0)?
其次,我有幾百萬個名字,這是一種有效的做事方式嗎?
FirstName = c("mary", "paul", "mother", "john", "red", "little", "king")
LastName = c("berry", "hollywood", "theresa", "jones", "rover", "tim", "arthur")
FullName = c("mary berry", "anthony horrowitz", "jennifer lawrence", "john jones", "red rover", "mick jagger", "king arthur")
df = data.frame(FirstName, LastName, FullName)
#attempt 1 and error
df$match_firstname <- df[mapply(grepl, df$FirstName, df$FullName), ]
Error in `$<-.data.frame`(`*tmp*`, match_firstname, value = list(FirstName = c("mary", :
replacement has 4 rows, data has 7
#attempt 2 and error
df$match_firstname <- ifelse(df[mapply(grepl, df$FirstName, df$FullName), ], 1, 0)
Error in ifelse(df[mapply(grepl, df$FirstName, df$FullName), ], 1, 0) :
'list' object cannot be coerced to type 'logical'
uj5u.com熱心網友回復:
相反,我們可以使用str_detectwhich 對兩者都進行了矢量化pattern,string而在Map/mapply代碼中,它在每一行上回圈,因此效率可能會降低
library(dplyr)
library(stringr)
df %>%
filter(str_detect(FullName, FirstName))
-輸出
FirstName LastName FullName
1 mary berry mary berry
2 john jones john jones
3 red rover red rover
4 king arthur king arthur
如果我們想添加一個新的二進制列,而不是filtering,使用as.integeror將邏輯轉換為二進制
df <- df %>%
mutate(match_firstname = (str_detect(FullName, FirstName)))
-輸出
FirstName LastName FullName match_firstname
1 mary berry mary berry 1
2 paul hollywood anthony horrowitz 0
3 mother theresa jennifer lawrence 0
4 john jones john jones 1
5 red rover red rover 1
6 little tim mick jagger 0
7 king arthur king arthur 1
OP 代碼中的錯誤是因為我們將資料子集分配到原始資料集中的新列中,這顯然會導致長度差異
df[mapply(grepl, df$FirstName, df$FullName), ]
FirstName LastName FullName
1 mary berry mary berry
4 john jones john jones
5 red rover red rover
7 king arthur king arthur
與之前的解決方案類似,使用
df$match_firstname <- (mapply(grepl, df$FirstName, df$FullName))
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/430474.html
標籤:r
下一篇:根據id序列展開列
