Разбить строку строки на несколько столбцов в R - PullRequest
0 голосов
/ 16 февраля 2019

Я использовал R, и у меня есть эта строка в виде строки, и мне нужно разделить ее на столбцы

'id': 1050442590754103297, 'id_str': '1050442590754103297', 'name': 'ام رودينا', 'screen_name': 'uclkGkQ5', 'location': None, 'url': None, 'description': '\ u200f \ u200f من زوي الاحتياجات الخاصه', 'translationator_type': 'none' protect '': False,' проверено ': False,' follow_count ': 1567,' friends_count ': 4019,' named_count ': 0,' favourites_count ': 6669,' statuses_count ': 9279,' creation_at ':' чт 11 октября 17:46:44 +0000 2018 ',' utc_offset ': нет,' time_zone ': нет,' geo_enabled ': False,' lang ':' ar ',' contributors_enabled ': False,' is_translator ': False,' profile_background_color ':'F5F8FA', 'profile_background_image_url': '', 'profile_background_image_url_https': '', 'profile_background_tile': False, 'profile_link_color': '1DA1F2', 'profile_sidebar_border_color': 'C0DEED', 'profile_color_color_bar_color_side_bar)':' 333333 ',' profile_use_background_image ': True,' profile_image_url ':' * http://pbs.twimg.com/profile_images/1059769079790268416/sJpep_V8_normal.jpg', 'profile_image_url_https': '* https://pbs.twimg.com/profile_images/1059769079790268416/sJpep_V8_normal.jpg',' profile_banner_url ':' * https://pbs.twimg.com/profile_banners/1050442590754103297/1539390015', 'default_profile': True, 'default_profile_image': False,'follow': None, 'follow_request_sent': None, 'notifications': None

Я пытался этот код работает, но мне нужно указать количество столбцов, которые мне нужны, а также мне нужно переименоватьстолбцы в конце, так что это сложно и занимает время

d<-str_split_fixed(try$user, ",", 4)

результат, который я получил, и он без имени столбцов:

'id': 1050442590754103297    'id_str': '1050442590754103297'   'name': 'ام رودينا <U+267F>'

и четвертый столбец имеет остальныестроки

'screen_name': 'uclkGkQ5', 'location': None, 'url': None, 'description': '\u200f\u200fمن زوي الاحتياجات الخاصه<U+267F>', 'translator_type': 'none', 'protected': False, 'verified': False, 'followers_count': 1567, 'friends_count': 4019, 'listed_count': 0, 'favourites_count': 6669, 'statuses_count': 9279, 'created_at': 'Thu Oct 11 17:46:44 +0000 2018', 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'lang': 'ar', 'contributors_enabled': False, 'is_translator': False, 'profile_background_color': 'F5F8FA', 'profile_background_image_url': '', 'profile_background_image_url_https': '', 'profile_background_tile': False, 'profile_link_color': '1DA1F2', 'profile_sidebar_border_color': 'C0DEED', 'profile_sidebar_fill_color': 'DDEEF6', 'profile_text_color': '333333', 'profile_use_background_image': True, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1059769079790268416/sJpep_V8_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1059769079790268416/sJpep_V8_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/1050442590754103297/1539390015', 'default_profile': True, 'default_profile_image': False, 'following': None, 'follow_request_sent': None, 'notifications': None

Мне нужен код, который разделяет строки на основе запятой и делает имя столбца словом перед (:), как показано здесь:

 id                         id_str                    name        screen_name     
 1050442590754103297      1050442590754103297       ام رودينا \u267f           uclkGkQ5

и то жедля остальной части строки надеюсь, что вы понимаете меня и спасибо

1 Ответ

0 голосов
/ 16 февраля 2019

Это имитирует (но не является законным) JSON.Один из методов (если предположения верны) состоит в том, чтобы «преобразовать в JSON» и проанализировать оттуда.

Предварительно: у меня возникла проблема в сеансе R, когда арабские буквы неправильно хранятся встрока.Это происходит до звонков на gsub и т. Д., Поэтому я считаю, что на вашем компьютере это может работать нормально.В результате вы увидите пустые строки в выводе.(Недостаток, ищущий это локально, я хотел бы сначала дать вам код).

Допущения:

  • нет встроенных двойных кавычек
  • буквенные строки True / False / None никогда не внедряются в текст, кроме логических значений (например, 'screen_name':'Is None' не бывает)
  • , которые вы готовы найти NULL в ваших данных,где ранее было :None

Важные преобразования:

  • True и False в нижний регистр
  • None в null
  • инкапсулирует всю вещь в словаре с окружающими { и }
  • , преобразует все одинарные кавычки в двойные кавычки

Можно использоватьmagrittr здесь для удобства чтения, или вы можете просто вложить все функции (чуть быстрее):

out <- jsonlite::fromJSON(
  paste0("{", gsub(":\\s*True\\s*(,?)", ":true\\1",
                   gsub(":\\s*False\\s*(,?)", ":false\\1",
                        gsub(":\\s*None\\s*(,?)", ":null\\1",
                             gsub("'", '"', s)))),
         "}"))
# or
library(magrittr)
out <- s %>%
  gsub(":\\s*True\\s*(,?)", ":true\\1", .) %>%
  gsub(":\\s*False\\s*(,?)", ":false\\1", .) %>%
  gsub(":\\s*None\\s*(,?)", ":null\\1", .) %>%
  gsub("'", '"', .) %>%
  paste0("{", ., "}") %>%
  jsonlite::fromJSON(.)

Результаты (сжатые с str):

str(out)
# List of 39
#  $ id                                : num 1.05e+18
#  $ id_str                            : chr "1050442590754103297"
#  $ name                              : chr "          "
#  $ screen_name                       : chr "uclkGkQ5"
#  $ location                          : NULL
#  $ url                               : NULL
#  $ description                       : chr "<U+200F><U+200F>                        "
#  $ translator_type                   : chr "none"
#  $ protected                         : logi FALSE
#  $ verified                          : logi FALSE
#  $ followers_count                   : int 1567
#  $ friends_count                     : int 4019
#  $ listed_count                      : int 0
#  $ favourites_count                  : int 6669
#  $ statuses_count                    : int 9279
#  $ created_at                        : chr "Thu Oct 11 17:46:44 +0000 2018"
#  $ utc_offset                        : NULL
#  $ time_zone                         : NULL
#  $ geo_enabled                       : logi FALSE
#  $ lang                              : chr "ar"
#  $ contributors_enabled              : logi FALSE
#  $ is_translator                     : logi FALSE
#  $ profile_background_color          : chr "F5F8FA"
#  $ profile_background_image_url      : chr ""
#  $ profile_background_image_url_https: chr ""
#  $ profile_background_tile           : logi FALSE
#  $ profile_link_color                : chr "1DA1F2"
#  $ profile_sidebar_border_color      : chr "C0DEED"
#  $ profile_sidebar_fill_color        : chr "DDEEF6"
#  $ profile_text_color                : chr "333333"
#  $ profile_use_background_image      : logi TRUE
#  $ profile_image_url                 : chr "http://pbs.twimg.com/profile_images/1059769079790268416/sJpep_V8_normal.jpg"
#  $ profile_image_url_https           : chr "https://pbs.twimg.com/profile_images/1059769079790268416/sJpep_V8_normal.jpg"
#  $ profile_banner_url                : chr "https://pbs.twimg.com/profile_banners/1050442590754103297/1539390015"
#  $ default_profile                   : logi TRUE
#  $ default_profile_image             : logi FALSE
#  $ following                         : NULL
#  $ follow_request_sent               : NULL
#  $ notifications                     : NULL

Примечания:

  • напоминание: пустые места здесь являются проблемой с моей локальной настройкой "локали", не обязательноздесь (извините, я не часто обрабатываю не ASCII на своей консоли)
  • поле с большим целым числом id преобразуется в numeric и не может быть целым числом без использования bit64пакет, я не знаю, будет ли это проблемой для вас
  • Я пытался быть «осторожным» с заменами, и быть очень конкретным с шаблонами регулярных выражений, ища предшествующую двоеточие, без тиков, инеобязательная следующая запятая (потому что за последним None ничего не следует);Быть настолько конкретным, насколько это возможно, уменьшает возможность неправильной замены этих литералов в строке
  • Я еще раз подчеркиваю предположение только-одиночные кавычки ... если присутствуют двойные кавычки, они испортят все этои я не задумывался о том, чтобы разобраться с ними
...