У меня есть фрейм данных с именем, фамилией, и я хочу переставить их, но ТОЛЬКО для строк со значениями. Есть много пустых полей, и я не хочу переупорядочивать их, чтобы всегда было значение firstname без значения lastname. Бывший:
number<- c(1,2,3,4,5)
firstname<- c('','Eddie','Edward','','Edurardo')
lastname <- c('','Vedder', 'Van Halen', '', 'Norton')
permtest <- data.frame(number,firstname,lastname)
permtest
number firstname lastname
1 1
2 2 Eddie Vedder
3 3 Edward Van Halen
4 4
5 5 Eduardo Norton
Ожидаемые результаты:
Но нет:
или:
Я попробовал функцию преобразования, но она не сработала:
permtest2 <- transform( permtest2, firstname = sample(firstname,lastname) )





Помогает перетасовка только непустых записей:
permtest$lastname[permtest$lastname != ''] <- sample(permtest$lastname[permtest$lastname != ''])
permtest
# number firstname lastname
# 1 1
# 2 2 Eddie Van Halen
# 3 3 Edward Vedder
# 4 4
# 5 5 Edurardo Norton
Однако сначала мне пришлось добавить это: dat[is.na(dat)] = ' '
Один из многих способов сделать это:
permtest[permtest == ''] = NA
library(dplyr)
permtest %>%
dplyr::filter(!is.na(lastname), !is.na(firstname)) %>%
dplyr::mutate(val = paste(firstname, lastname)) %>%
dplyr::pull(val)
[1] "Eddie Vedder" "Edward Van Halen" "Edurardo Norton"
Я уверен, что это тоже правильный ответ, но я получил эту (возможно, несвязанную) ошибку: Ошибка: 'pull' не является экспортированным объектом из 'namespace: dplyr'
Вы имели ввиду dat[is.na(dat)] = ''? Это то, что я использовал вместе с кодом Юлиуса (см. Выше) после получения ошибки, и все вместе, похоже, работает.
Эта первая строка кода преобразует ' ' в NA, поэтому я могу отфильтровать ее с помощью команды !is.na. Добавленный вами комментарий делает обратное и преобразует NA в ' ', но изначально у вас нет NA в вашем фрейме данных, поэтому он ничего не сделает.
Используя tidyverse, вы могли бы сделать
library(tidyverse)
library(stringr)
permtest2 <- permtest %>% mutate(Nfname = str_length(firstname)) %>% filter(Nfname > 0) %>% mutate(lastname = sample(lastname, size = length(lastname))) %>% select(-Nfname)
Я новичок в R, но мне кажется, что это меняет размеры permtest2. Мне еще нужно, чтобы он был длиной 5 рядов (оставьте ряды с пробелами).
Потрясающий! Сработало как положено. Спасибо!