2016-11-18 10 views
0

내 df (2 행, 2 열, TagsScore) 내에 '태그'라는 하나의 열을 기반으로 여러 더미 변수를 만들려고합니다. 문제는 각각 셀 Tags의 chr 값은 최대 30 개까지 가능합니다. 하나의 셀에서 각 고유 한 chr 값에 대해 새로운 더미 변수를 만들고 싶습니다. .여러 문자 값이있는 셀에서 더미 변수 만들기

structure(list(Tags = structure(c(27L, 16L, 4L), .Label = c("\"aan het water\", \"biologische gerechten\", \"certificaat van uitmuntendheid tripadvisor 2016\", \"er even tussenuit\", \"gebruik streekproducten\", \"iens topper 2016\", \"lactose intolerantie\", \"noten allergie\", \"pinda allergie\", \"vegetarische gerechten\", frans, glutenvrij, romantisch, wijnbar, zakelijk", 
"\"aan het water\", \"biologische gerechten\", \"certificaat van uitmuntendheid tripadvisor 2016\", \"gebruik streekproducten\", \"iens topper 2016\", \"lactose intolerantie\", \"noten allergie\", \"pinda allergie\", \"vegetarische gerechten\", glutenvrij, kindvriendelijk, romantisch, wereldkeuken, zakelijk", 
"\"aan het water\", \"biologische gerechten\", \"certificaat van uitmuntendheid tripadvisor 2016\", \"lactose intolerantie\", \"noten allergie\", \"pinda allergie\", \"vegetarische gerechten\", frans, glutenvrij, romantisch, zakelijk", 
"\"aan het water\", \"biologische gerechten\", \"gebruik streekproducten\", \"lactose intolerantie\", \"noten allergie\", \"pinda allergie\", \"vegetarische gerechten\", frans, glutenvrij, romantisch, wijnbar, zakelijk", 
"\"aan het water\", \"certificaat van uitmuntendheid tripadvisor 2016\", \"er even tussenuit\", \"iens topper 2016\", \"lactose intolerantie\", \"noten allergie\", \"pinda allergie\", glutenvrij, grieks, romantisch", 
"\"aan het water\", \"certificaat van uitmuntendheid tripadvisor 2016\", \"lactose intolerantie\", \"noten allergie\", \"pinda allergie\", italiaans, kindvriendelijk, romantisch, zakelijk", 
"\"aan het water\", \"high tea\", brasserie, frans, kindvriendelijk, romantisch, zakelijk", 
"\"aan het water\", \"high tea\", kindvriendelijk, romantisch, wereldkeuken", 
"\"aan het water\", \"iens topper 2016\", italiaans, kindvriendelijk, romantisch, zakelijk", 
"\"aan het water\", \"lactose intolerantie\", \"noten allergie\", \"pinda allergie\", glutenvrij, kindvriendelijk, romantisch, wereldkeuken, zakelijk", 
"\"aan het water\", \"lactose intolerantie\", frans, glutenvrij, zakelijk", 
"\"aan het water\", frans", "\"all you can eat buffet\", \"er even tussenuit\", \"lactose intolerantie\", \"noten allergie\", \"pinda allergie\", glutenvrij, kindvriendelijk, romantisch, wereldkeuken, zakelijk", 
"\"biologische gerechten\", \"certificaat van uitmuntendheid tripadvisor 2016\", \"er even tussenuit\", \"gebruik streekproducten\", \"lactose intolerantie\", \"noten allergie\", \"pinda allergie\", \"vegetarische gerechten\", glutenvrij, kindvriendelijk, romantisch, wereldkeuken", 
"\"biologische gerechten\", \"certificaat van uitmuntendheid tripadvisor 2016\", \"gebruik streekproducten\", \"high tea\", \"lactose intolerantie\", \"noten allergie\", \"pinda allergie\", \"vegetarische gerechten\", frans, glutenvrij, kindvriendelijk, romantisch, zakelijk", 
"\"biologische gerechten\", \"certificaat van uitmuntendheid tripadvisor 2016\", \"gebruik streekproducten\", \"iens topper 2016\", \"lactose intolerantie\", \"noten allergie\", \"pinda allergie\", \"vegetarische gerechten\", glutenvrij, kindvriendelijk, romantisch, zakelijk", 
"\"biologische gerechten\", \"certificaat van uitmuntendheid tripadvisor 2016\", \"gebruik streekproducten\", \"lactose intolerantie\", \"met familie\", \"met vrienden\", \"noten allergie\", \"pinda allergie\", \"vegetarische gerechten\", chinees, gastronomisch, glutenvrij, kindvriendelijk, romantisch, traditioneel, trendy, verjaardag, zakelijk", 
"\"biologische gerechten\", \"certificaat van uitmuntendheid tripadvisor 2016\", \"vegetarische gerechten\", italiaans, kindvriendelijk", 
"\"biologische gerechten\", \"gebruik streekproducten\", \"iens topper 2016\", \"lactose intolerantie\", \"noten allergie\", \"pinda allergie\", \"vegetarische gerechten\", bbq/grill, glutenvrij, kindvriendelijk, romantisch, wijnbar", 
"\"biologische gerechten\", \"gebruik streekproducten\", \"lactose intolerantie\", \"vegetarische gerechten\", glutenvrij, romantisch, wereldkeuken", 
"\"biologische gerechten\", \"gebruik streekproducten\", frans, romantisch", 
"\"certificaat van uitmuntendheid tripadvisor 2016\", \"high tea\", \"lactose intolerantie\", \"noten allergie\", \"pinda allergie\", glutenvrij, romantisch, wereldkeuken, zakelijk", 
"\"er even tussenuit\", \"met familie\", \"met vrienden\", amerikaans, romantisch, trendy, verjaardag, wijnbar, zakelijk", 
"\"gebruik streekproducten\", \"lactose intolerantie\", \"noten allergie\", \"pinda allergie\", \"vegetarische gerechten\", frans, glutenvrij, romantisch, zakelijk", 
"\"high tea\", \"lactose intolerantie\", \"noten allergie\", \"pinda allergie\", frans, glutenvrij, romantisch, zakelijk", 
"\"lactose intolerantie\", \"noten allergie\", \"pinda allergie\", frans, glutenvrij, kindvriendelijk, romantisch, wijnbar, zakelijk", 
"\"lactose intolerantie\", \"noten allergie\", \"pinda allergie\", glutenvrij, kindvriendelijk, spaans", 
"\"lactose intolerantie\", frans, glutenvrij, romantisch, zakelijk", "grieks", "spaans"), class = "factor"), Score = c(8, 9, 8.8)), row.names = c(NA, 
-3L), class = c("tbl_df", "tbl", "data.frame"), .Names = c("Tags", 
"Score")) 

df$Tags[1] 저를 반환합니다 :

하지 (1/0) 당신에게 내가 dput(df)을 포함하고있어 문제를 표시하려면
[1] "lactose intolerantie", "noten allergie", "pinda allergie", glutenvrij, kindvriendelijk, spaans 
30 Levels: "aan het water", "biologische gerechten", "certificaat van uitmuntendheid tripadvisor 2016", "er even tussenuit", "gebruik streekproducten", "iens topper 2016", "lactose intolerantie", "noten allergie", "pinda allergie", "vegetarische gerechten", frans, glutenvrij, romantisch, wijnbar, zakelijk ... 

691,363,210 수동 나는 예를 들어 다음을 실행할 수 있으며, 그것은 작동합니다

df = mutate(df, lactose_intolerantie = ifelse(grepl("lactose intolerantie", Tags), 1, 0)) 

그것은 포함하는 새로운 열을 만든 일이 없을 때 값이 "유당 intolerantie는"현재 제로 때.

가능한 모든 chr 값에 대해 더 빨리 수행 할 수있는 방법을 찾고 있습니다. 누군가가 도울 수 있기를 바랍니다. 생각을 해주셔서 감사합니다.

+0

가능한 모든 문자의 목록은 당신이 확인하고 싶은 값이 있습니까? – aosmith

답변

1

단지 시작 단계 :

x1 = gsub("\"", "",unlist(strsplit(as.character(df$Tags[1]),","))) 
x2 = gsub("\"", "",unlist(strsplit(as.character(df$Tags[2]),","))) 
x3 = gsub("\"", "",unlist(strsplit(as.character(df$Tags[3]),","))) 

# removing only spaces occuring at the start 
x11=gsub("^ ","" ,x1) 
x22=gsub("^ ","" ,x2) 
x33=gsub("^ ","" ,x3) 

# get the unique ones 
x = unique(c(x11,x22,x33)) 

df1 = as.data.frame(lapply(as.list(x), function(x) as.numeric(grepl(x, df$Tags)))) 
colnames(df1) = x 

> df1 
    lactose intolerantie noten allergie pinda allergie glutenvrij kindvriendelijk spaans biologische gerechten 
1     1    1    1   1    1  1      0 
2     1    1    1   1    1  0      1 
3     1    1    1   1    0  0      1 
    certificaat van uitmuntendheid tripadvisor 2016 gebruik streekproducten iens topper 2016 vegetarische gerechten 
1            0      0    0      0 
2            1      1    1      1 
3            0      1    0      1 
    romantisch zakelijk aan het water frans wijnbar 
1   0  0    0  0  0 
2   1  1    0  0  0 
3   1  1    1  1  1 
+0

예, 이것 때문에 제가 가버립니다! 공식적으로 나는 원래의 df에 10,000 개 이상의 행을 가지고 있지만 레스토랑에 관한 것이기 때문에 1 만 개가 넘는 태그는 확실하지 않습니다. 큰! –

0

separate_rows을 사용하면 내가 원래 열을 유지하지 않았 음을 의미하지만 dplyr 및 tidyr 있는 가능성. 행 번호에 따라 다시 결합하거나 separate_rows에 사용할 "태그"의 중복 열을 만들 수 있습니다.

각 셀 내의 태그의 하나의 인스턴스가 존재하는 경우 :

library(dplyr) 
library(tidyr) 
library(tibble) 

df %>% 
    rownames_to_column() %>% 
    separate_rows(Tags, sep = ", ") %>% 
    mutate(Tags = gsub('"', "", Tags), n = 1) %>% 
    spread(Tags, n, fill = 0) 

는 I가 세트로 행 이름 첨가는 대신에 단일 열에서의 개별 행에있을 '태그를 "분리 일부 태그 이름 주위에 여분의 따옴표를 제거한 다음 와이드 형식으로 퍼지기 전에 각 행에 대해 1의 더미 열을 만들었습니다.

각 행은 문자열 중 하나를 여러 값을 가질 수있는 경우 :

df %>% 
    rownames_to_column() %>% 
    separate_rows(Tags, sep = ", ") %>% 
    mutate(Tags = gsub('"', "", Tags), n = 1) %>% 
    distinct(rowname, Tags, .keep_all = TRUE) %>% 
    spread(Tags, n, fill = 0)