1

我有一个包含名字、姓氏的数据框,我想对它们进行排列,但仅限于具有值的行。有许多空字段,我不想对它们重新排序,以便永远存在没有姓氏值的名字值。前任:

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) )
4

3 回答 3

1

有帮助的是只改组非空条目:

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
于 2018-12-10T19:57:47.483 回答
0

执行此操作的多种方法之一:

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" 
于 2018-12-10T19:57:51.727 回答
0

使用 tidyverse 你可以做

library(tidyverse)
library(stringr)

permtest2 <- permtest %>% mutate(Nfname = str_length(firstname)) %>% filter(Nfname > 0) %>% mutate(lastname = sample(lastname, size = length(lastname))) %>% select(-Nfname)
于 2018-12-10T20:06:02.070 回答