отдельные строки в столбце на основе количества разделителей - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь разделить 1-й столбец на основе разделителя ("_") в df.

country_city_gender_age_name_state =c("US_Dallas_Male_23_hanes_TX","US_LosAngeles_CA",
"US_Atlanta_Female_jenny_GA","US_Orlando_kane_FL")

df = data.frame(country_city_gender_age_name_state)

I-я строка перед 1-м разделителем, 2-я строка после 1-го разделителя и последняя строка перед последним разделителем являются постоянными
Согласно приведенному выше утверждению
в строке_1: все строки разделены на основе разделителя и разделителей no.of: 5
row_2: разделитель 2,3,4 отсутствует, поэтому значения являются пустыми, а разделители no.of -2
row_3: разделитель 3 отсутствует, поэтому значения являются пустыми и разделители no.of отсутствуют 4
row_4: разделитель 2,3 отсутствует, поэтому значения пусты и разделители no.of составляют 3

Я пробовал с приведенным ниже кодом.

df$country<- sapply(strsplit(as.character(df$country_city_gender_age_name_state),"_"), "[",1)
df$city<- sapply(strsplit(as.character(df$country_city_gender_age_name_state),"_"), "[",2)
df$gender<- sapply(strsplit(as.character(df$country_city_gender_age_name_state),"_"), "[",3)
df$age<- sapply(strsplit(as.character(df$country_city_gender_age_name_state),"_"), "[",4)
df$name<- sapply(strsplit(as.character(df$country_city_gender_age_name_state),"_"), "[",5)
df$state<- sapply(strsplit(as.character(df$country_city_gender_age_name_state), "_"), tail, 1)  

Желаемый выходной кадр данных будет

country = c("US","US","US","US")
city = c("Dallas","LosAngeles","Atlanta","Orlando")
gender = c("Male","","Femal","")
age = c("23","","","")
name = c("hanes","","Jenny","kane")
state = c("TX","CA","GA","FL")

out_df = data.frame(country_city_gender_age_name_state,country,city,gender,age,name,state)

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Я не могу предложить красивое решение, но это должно сработать.Вы всегда можете найти списки штатов, стран и городов, поэтому просто создайте условия ifelse, чтобы сравнить, входит ли значение в один из списков.Для названий состояний вы можете иметь дело с условием regEx для 2 букв или использовать список.Значение, которое не может быть найдено в списках или соответствует regEx, должно иметь имя.

library(dplyr)
dt <- as.data.table(df)

dt$number_of_entry <- rep(1:nrow(dt))
new_dt <- dt %>% mutate(country_city_gender_age_name_state = 

strsplit (as.character (country_city_gender_age_name_state), "_"))%>% unnest (country_city_gender_age_name_state)

output <- data.frame(id = 1:nrow(dt),
                     country = rep(NA, nrow(dt)),
                     gender = rep(NA, nrow(dt)),
                     age = rep(NA, nrow(dt)),
                     name = rep(NA, nrow(dt)),
                     state = rep(NA, nrow(dt)))

number_of_entry = 1
for (i in nrow(new_dt)) {
  while (number_of_entry == new_dt$number_of_entry) {

    if (new_dt$country_city_gender_age_name_state[i] %in% list_of_countries) {
      output[number_of_entry,]$country = new_dt$country_city_gender_age_name_state[i]}
    else {

      if (new_dt$country_city_gender_age_name_state[i] %in% c("Female", "Male")) {
        output[number_of_entry,]$gender = new_dt$country_city_gender_age_name_state[i]}
      else {

        if (new_dt$country_city_gender_age_name_state[i] %in% list_of_cities) {
          output[number_of_entry,]$city = new_dt$country_city_gender_age_name_state[i]}
        else {
          if(grepl("\\d*", new_dt$country_city_gender_age_name_state[i])) {
            output[number_of_entry,]$age = new_dt$country_city_gender_age_name_state[i]}
          else {
            if (new_dt$country_city_gender_age_name_state[i] %in% list_of_states) {
              output[number_of_entry,]$state = new_dt$country_city_gender_age_name_state[i]}
            else {
              output[number_of_entry,]$name = new_dt$country_city_gender_age_name_state[i]}
            }
          }
         }
        }
      }
    }
  }
}
0 голосов
/ 06 июня 2018

Вы можете попробовать что-то подобное, хотя это может быть трудно обобщить.Это работает, если страна, город и штат никогда не пропускаются, пол всегда равен «Женский» или «Мужской», и единственные цифры в строке относятся к желаемой переменной «age».Конечно, некоторые строки могут быть адаптированы в случае необходимости, а также, возможно, некоторые из этих строк могут быть немного сокращены.В любом случае, это помогает?

df = data.frame(country_city_gender_age_name_state, stringsAsFactors = F)

df$country <- sapply(strsplit(df$country_city_gender_age_name_state, "_"), "[[", 1)
df$city <- sapply(strsplit(df$country_city_gender_age_name_state, "_"), "[[", 2)
df$state <-  sapply(strsplit(df$country_city_gender_age_name_state, "_"), tail, 1)
df$gender <- ifelse(grepl("Female", df$country_city_gender_age_name_state), "Female", ifelse(grepl("Male", df$country_city_gender_age_name_state), "Male", NA))


df$age <- as.numeric(gsub("\\D", "", df$country_city_gender_age_name_state))                   

df$name <- sapply(strsplit(df$country_city_gender_age_name_state, "_"), tail, 2)[1,]
df$name <- ifelse(sapply(1:nrow(df), function(x) df[x,"name", drop = FALSE] %in%  df[x,2:6]), NA, df$name)

> df[,c(1:3,5:7,4)]
  country_city_gender_age_name_state country       city gender age  name state
1         US_Dallas_Male_23_hanes_TX      US     Dallas   Male  23 hanes    TX
2                   US_LosAngeles_CA      US LosAngeles   <NA>  NA  <NA>    CA
3         US_Atlanta_Female_jenny_GA      US    Atlanta Female  NA jenny    GA
4                 US_Orlando_kane_FL      US    Orlando   <NA>  NA  kane    FL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...