我有一個來自調查平臺的大 df 檔案。列包含一個問題(作為標題)以及所有可能的答案。我試圖將每個答案列分成一組新的列(答案名稱作為新列的名稱)。
之后,我希望每個新列都指示該值是否出現在原始列(帶有“1”)中,以便更輕松地處理資料
df<-data.frame("name"= c("John","mark","bell","elsa"),"what do you like to
eat"=c("apple","fries apple","peach","bread"))
原始檔案
| 姓名 | 你喜歡吃什么 |
|---|---|
| 約翰 | 蘋果 |
| 標記 | 薯條蘋果 |
| 鐘 | 桃 |
| 艾爾莎 | 面包 |
我正在使用這個有效的代碼,但我確信必須有更有效/更簡單的方法來做到這一點,因為我有超過 50 個這樣的列。
df<-df %>%
separate(what.do.you.like.to.eat, c("apple","fries","peach","bread",NA ), remove = F)
df[,3:6]<-""
{
df[,3] = with(df, ifelse(grepl("apple", df$what.do.you.like.to.eat,ignore.case = T),
paste('1', df[,3]),
paste("", df[,3])))
df[,4] = with(df, ifelse(grepl("fries", df$what.do.you.like.to.eat,ignore.case = T),
paste('1', df[,4]),
paste("", df[,4])))
df[,5] = with(df, ifelse(grepl("peach", df$what.do.you.like.to.eat,ignore.case = T),
paste('1', df[,5]),
paste("", df[,5])))
df[,6] = with(df, ifelse(grepl("bread", df$what.do.you.like.to.eat,ignore.case = T),
paste('1', df[,6]),
paste("", df[,6])))
}
欲望輸出
| 姓名 | 你喜歡吃什么 | 蘋果 | 薯條 | 桃 | 面包 |
|---|---|---|---|---|---|
| 約翰 | 蘋果 | 1 | |||
| 標記 | 薯條蘋果 | 1 | 1 | ||
| 鐘 | 桃 | 1 | |||
| 艾爾莎 | 面包 | 1 |
uj5u.com熱心網友回復:
您可以使用purrr::map來應用您的答案向量,并針對每個答案檢查它們在字串中的存在。
library(tidyverse)
df <- data.frame(
name = c("John", "mark", "bell", "elsa"),
"what do you like to eat" = c("apple", "fries apple", "peach", "bread")
)
ans <- c("apple", "fries", "peach", "bread")
map_dfc(ans,~ transmute(df, !!sym(.x) := str_detect(what.do.you.like.to.eat, .x))) %>%
bind_cols(df, .)
#> name what.do.you.like.to.eat apple fries peach bread
#> 1 John apple TRUE FALSE FALSE FALSE
#> 2 mark fries apple TRUE TRUE FALSE FALSE
#> 3 bell peach FALSE FALSE TRUE FALSE
#> 4 elsa bread FALSE FALSE FALSE TRUE
uj5u.com熱心網友回復:
好的,我已經完成了,告訴我這是否適合您:
my_df <- data.frame("name" = c("John","mark","bell","elsa"),
"what do you like to eat" = c("apple","fries apple","peach","bread"),
stringsAsFactors = FALSE)
my_var <- unique(sort(str_split(string = my_df$what.do.you.like.to.eat, pattern = " ", simplify = TRUE)))
my_pos <- which(my_var == "")
if (length(my_pos)) {
my_var <- my_var[-my_pos]
}
my_col <- c(colnames(my_df), my_var)
my_miss <- setdiff(my_col, colnames(my_df))
my_df[my_miss] <- NA
my_f <- function(x, y) {
my_var <- grep(pattern = colnames(my_df)[x], x = my_df[, y])
if (length(my_var)) {
my_df[my_var, x] <<- 1
}
}
lapply(3:ncol(my_df), function(x) my_f(x, 2))
你可以把這部分改成這樣:
my_df <- data.frame("name" = c("John","mark","bell","elsa"),
"what do you like to eat" = c("i like apple","i love fries apple","i'm kind of peach","bread all the way"),
stringsAsFactors = FALSE)
my_var <- unique(sort(str_split(string =
my_df$what.do.you.like.to.eat, pattern = " ", simplify = TRUE)))
my_food <- c("apple", "fries", "bread", "peach")
my_var <- my_var[which(my_var %in% my_food)]
my_pos <- which(my_var == "")
if (length(my_pos)) {
my_var <- my_var[-my_pos]
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/377744.html
下一篇:如果特定行包含給定值,則洗掉列
