#r #string #dataframe #data-wrangling
#r #строка #фрейм данных #перебор данных
Вопрос:
У меня есть вектор строки, импортированный из файла Excel в виде одной строки "rnrnNamernrnPositionrnrnAgernrnGenderrnrnSamrnrnManagerrnrn30rnrn MalernrnMirarnrnHeadrnrn25rnrnFemalernrnMariornrn40rnrnDirectorrnrn Mariarnrn25rnrnOfficerrnrnFemale"
Я хочу преобразовать эту строку в фрейм данных, в котором имена столбцов исходят из первых четырех значений (имя, должность, возраст, пол). если какие-либо отсутствующие ячейки должны быть нулевыми или NA.
таблица, которая будет
Name | Position | Age | Gender
Sam | Manager | 30 | Male
Mira | Head | 25 | Female
Mario | Director | 40 | NA
Maria | Officer | 25 | Officer
Я разделил данные на вектор со многими строками,
bb <- c("rnrnNamernrnPositionrnrnAgernrnGenderrnrnSamrnrnManagerrnrn30rnrn MalernrnMirarnrnHeadrnrn25rnrnFemalernrnMariornrn40rnrnDirectorrnrn Mariarnrn25rnrnOfficerrnrnFemale")
bb_split <- bb %>% str_split(pattern ="rnrn") %>% unlist()
Затем я перепробовал много способов добавить столбец с номером и попытаться сгруппировать строки с этим номером, но это превратилось в список вложений, не доходя до моей тюрьмы.
Я ценю вашу поддержку.
Комментарии:
1. мне кажется, что обнаружение отсутствующих ячеек здесь является сложной задачей … если бы было какое-то значение (или, по крайней мере, просто двойной разрыв), где должно быть отсутствующее значение, это должно быть довольно просто, но, как это кажется, нетривиально правильно вставить недостающие значения
2. Да, вы правы. Я попытался преобразовать его в матрицу, но это стало еще одним беспорядком
Ответ №1:
Мне было бы любопытно, как вы выполнили импорт из Excel, может быть, вы сможете использовать лучший метод.
Однако в вашей строке после Mario и Maria имя заказа, должность, возраст, пол внезапно переключаются, что, как я полагаю, является ошибкой. Поэтому я использую соответственно переупорядоченный вектор.
В приведенном ниже коде используется регулярное выражение, которое разбивается на "rnrn"
пробелы, а также на пробелы, за которыми не следует "Male"
или "Female"
.
Конечно, вам нужно адаптировать эту логику и к другим переменным, но это может дать вам представление о том, как решить вашу проблему.
b1 <- trimws(el(strsplit(bc, "rnrn|\s(?!Male|Female)", perl=TRUE))[-1])
m <- matrix(replace(b1, b1 == "", NA), ncol=4, byrow=TRUE)
res <- setNames(as.data.frame(m[-1, ]), m[1, ])
res
# Name Position Age Gender
# 1 Sam Manager 30 Male
# 2 Mira Head 25 Female
# 3 Mario Director 40 <NA>
# 4 Maria Officer 25 Female
Данные:
bc <- "rnrnNamernrnPositionrnrnAgernrnGenderrnrnSamrnrnManagerrnrn30rnrn MalernrnMirarnrnHeadrnrn25rnrnFemalernrnMariornrnDirectorrnrn40rnrn MariarnrnOfficerrnrn25rnrnFemale"
Комментарии:
1. Спасибо за ваш ответ, я получил данные через Outlook в виде таблицы HTML, я попытался использовать пакет RDCOMClient для передачи данных из Outlook в R, но это выдало ошибку. и я не смог решить эту ошибку. поэтому я решил использовать Power Automate для загрузки определенного электронного письма в Excel на OneDrive. таким образом, я могу извлечь данные, которые теперь в этом формате. Я не знаю, есть ли лучший и простой способ получить данные из Outlook непосредственно в R.