[英]Create a new data frame column based on another column
我有一個包含兩列的數據框,並且想要創建第三列,該列本質上是一個布爾值,用於確定第二列是否包含特定的一組指定值。
f <- data.frame(name=c("John", "Sara", "David", "Chad"),
car=c("Honda|Ford", "BMW", "Toyota|Chevy|Ford",
"Toyota|Chevy|Ford|Honda"))
我做的第一件事是刪除|。 從第二列的每個字符串中提取,然后將其值放在第三列中
library(stringr)
g = str_replace_all(f$car, "[^[:alnum:]]", " ")
f$make = c(g)
f
如果要創建另一個列(布爾值),如果make包含普通車,則為1,如果包含非普通車,則為0,我現在要執行的操作。
common = c("Honda", "Ford", "Toyota", "Chevy")
not_common = c("BMW", "Lexus", "Acura")
我已經嘗試了一些方法,包括stringer軟件包和ifelse來產生以下輸出。
name car make common
1 John Honda|Ford Honda Ford 1
2 Sara BMW BMW 0
3 David Toyota|Chevy|Ford Toyota Chevy Ford 1
4 Chad Toyota|Chevy|Ford|Honda Toyota Chevy Ford Honda 1
由於可以同時使用普通和不普通的汽車作為條目,因此普通的品牌應該覆蓋普通的品牌,並且該行的普通列中的值應為0。 因此,如果一個條目同時包含BMW和Ford,則該條目在公共列中應為0。
任何人都可以幫助完成此任務。
哦,這是我嘗試使用Stringr包的方法,但是它不起作用。
common = c("Honda", "Ford", "Toyota", "Chevy")
not_common = c("BMW", "Lexus", "Acura")
common_match <- str_c(common)
not_match <- str_c(not_common)
main <- function(df) {
f$new_make <- str_detect(f$make, common_match)
df
}
main(f)
謝謝!
不知道這是否是最有效的方法,但是請嘗試使用grep
和ifelse
應用於f$car
每個值。 |
字符僅表示grep
搜索項or
將其組合在一起,而與數據中的分隔符無關。
f$common <- sapply(f$car,function(x) ifelse(length(grep("BMW|Lexus|Acura",x))>0,0,1))
結果:
> f
name car common
1 John Honda|Ford 1
2 Sara BMW 0
3 David Toyota|Chevy|Ford 1
4 Chad Toyota|Chevy|Ford|Honda 1
另一種方法和比較
f2 <- f[rep(1:4,50000),]
system.time({
v <- sapply(f2$make, strsplit, " ")
sapply(v, function(x) max(1-not_common %in% x)*max(common %in% x))
})
user system elapsed
7.94 0.01 8.00
system.time(sapply(f2$car,function(x) ifelse(length(grep("BMW|Lexus|Acura",x))>0,0,1)))
user system elapsed
28.72 0.04 28.87
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.