R: Как я могу извлечь элемент из столбца данных в искровом соединении (sparklyr) в трубе

У меня есть набор данных, как показано ниже.

Из-за большого объема данных я загрузил его через пакет sparklyr, поэтому могу использовать только операторы канала.

pos <- str_sub(csj$helpful,2)
neg1 <- str_sub(csj$helpful,4)
csj <- csj %>% mutate(neg=replace(helpful,stringr::str_sub(csj$helpful,4)==1,0))
csj <- csj %>% mutate(help=pos/neg)
csj
is.null(csj$helpful)

Я хочу создать столбец с именем «помощь», который является «первым номером полезного столбца/вторым номером полезного столбца».

Если второе число равно 0, мне нужно изменить второе число на 1, а затем разделить его.

Имя фрейма данных — csj.

Но это не работает.

введите здесь описание изображения

Буду рад, если кто-то поможет мне решить эту проблему.

После того, как я последовал совету @Sebastian Hoyos, я все же получил этот col1, col2, col3 как NAN, как показано на рисунке ниже. (Но пример, который он мне дал, сработал). Как мне решить эту проблему?

введите здесь описание изображения

+) После того, как я попробовал без as.numeric части, я получил этот результат.

> csj %>%
+   mutate(col1 = stringi::stri_extract_first_regex(csj$helpful, pattern = "[0-9]"),#extract first number
+          col2 = stringi::stri_extract_last_regex(csj$helpful, pattern = "[0-9]"),#extract second
+          col3 = ifelse(col2 == 0, 1, col2 ),#change 0s to 1
+          help = col1/col3) #divide row1 and 3


# Source:   lazy query [?? x 12]
# Database: spark_connection
   `_c0` reviewerID     asin  helpful length_of_review overall unixReviewTime category   col1  col2  col3   help
   <int> <chr>          <chr> <chr>              <dbl> <chr>   <chr>          <chr>      <chr> <chr> <chr> <dbl>
 1     0 A1KLRMWW2FWPL4 31887 [0, 0]               172 5       1297468800     Clothes_s~ ""    ""    NA      NaN
 2     1 A2G5TCU2WDFZ65 31887 [0, 0]               306 5       1358553600     Clothes_s~ ""    ""    NA      NaN
 3     2 A1RLQXYNCMWRWN 31887 [0, 0]               312 5       1357257600     Clothes_s~ ""    ""    NA      NaN
 4     3 A8U3FAMSJVHS5  31887 [0, 0]               405 5       1398556800     Clothes_s~ ""    ""    NA      NaN
 5     4 A3GEOILWLK86XM 31887 [0, 0]               453 5       1394841600     Clothes_s~ ""    ""    NA      NaN
 6     5 A27UF1MSF3DB2  31887 [0, 0]               375 4       1396224000     Clothes_s~ ""    ""    NA      NaN
 7     6 A16GFPNVF4Y816 31887 [0, 0]               334 5       1399075200     Clothes_s~ ""    ""    NA      NaN
 8     7 A2M2APVYIB2U6K 31887 [0, 0]               158 5       1356220800     Clothes_s~ ""    ""    NA      NaN
 9     8 A1NJ71X3YPQNQ9 31887 [0, 0]                96 4       1384041600     Clothes_s~ ""    ""    NA      NaN
10     9 A3EERSWHAI6SO  31887 [7, 8]               532 5       1349568000     Clothes_s~ ""    ""    NA      NaN
# ... with more rows
> 

person Alice Shin    schedule 20.05.2018    source источник


Ответы (1)


Хотя это не самая элегантная строка кода, она должна выполнить свою работу. Поскольку не предоставлен образец набора данных, кроме снимка экрана, я просто создал образец с важными элементами, которые вас интересовали.

csj <- tibble(helpful = rep(c("[0,0]","[0,1]","[0,2]","[1,3]"),100),
                            overall = rep(c(5,4,3,2),100))
#this change the columns and creates the help column
csj %>%
      mutate(col1 = as.numeric(stringi::stri_extract_first_regex(helpful, pattern = "[0-9]")),#extract first number
             col2 = as.numeric(stringi::stri_extract_last_regex(helpful, pattern = "[0-9]")),#extract second
             col3 = ifelse(col2 == 0, 1, row2 ),#change 0s to 1
             help = col1/col3) %>% #divide row1 and 3
      select(helpful, help)#select the rows you wish to keep

Это должно работать до тех пор, пока вы изменяете функции в своем наборе данных по мере необходимости. Также обратите внимание, что полезным является символьный тип в вашем наборе данных, поэтому вам нужно изменить его на числовой.

РЕДАКТИРОВАТЬ: Итак, я посмотрел на искры и понял, почему код не работает, поэтому я создал пример для себя, чтобы проверить. Хотя я не полностью реплицировал ваши данные, я придумал достаточно вещей, чтобы, надеюсь, предоставить рабочее решение.

library(sparklyr)
library(dplyr)
library(ggplot2)
library(magrittr) 
sc <- spark_connect(master="local")
#create dataframe
cjs <- tibble(helpful = rep(c("[0,  0]","[0, 1]","[0, 2]","[1, 3]","[,1]",NA,"a"),100),
              overall = rep(c(6,5,4,3,2,1,0),100))

#transfer to sparkly
csj <- copy_to(sc, csj,"cjs")

#this should do the trick
csj %>% 
  mutate(newcol2 = regexp_replace(helpful, "[^0-9,]", " "), 
         newcol3 = as.numeric(substring_index(newcol2, ",", 1)),
         newcol4 = as.numeric(substring_index(newcol2,",",-1)),
         newcol5 = ifelse(newcol4 == 0, 1, newcol4),
         help = newcol3/newcol5) %>% 
  select(starts_with("new"),help) #select the columns you need with help calculated appropriately
person Sebastian Hoyos    schedule 21.05.2018
comment
Привет, @Sebastian, я попробовал код, который ты отредактировал, и он сработал отлично!!! Я так долго не мог решить! Большое спасибо!!!!! # Source: lazy query [?? x 5] # Database: spark_connection newcol1 newcol2 newcol3 newcol4 help <chr> <dbl> <dbl> <dbl> <dbl> 7 " 0, 0 " 0 0 1 0 8 " 0, 0 " 0 0 1 0 9 " 0, 0 " 0 0 1 0 10 " 7, 8 " 7 8 8 0.875 # ... with more rows :: вот что получилось! идеально! - person Alice Shin; 22.05.2018
comment
@AliceShin Если ответ решил проблему, рассмотрите возможность принятия ответа - person Alper t. Turker; 09.06.2018