Как извлечь уникальные значения нефакторного столбца на основе его класса - PullRequest
1 голос
/ 16 июня 2019

Я создаю data.frame, который будет служить codebook для существующего data.frame, а один из столбцов codebook - это диапазон значений в каждом столбце существующего data.frame.Мне нужно заполнить каждое из уникальных значений из столбца class: character, отделяя их с помощью "/"

1) Я попытался использовать оператор if else, где условие является class столбца и function - это unique()

2) я также использовал оператор if else и взял первый элемент (используя x[1] в качестве функции) столбца и получиложидаемый результат

dat - это существующий фрейм данных

function(dat){
dfr <- data.frame(
row.names = c(1:length(colnames(dat))),
ColumnNames = names(dat),
class = sapply(dat, class),
Range = sapply(dat, function(x)
  if(class(x) == "character")
           paste(unique(x), sep = " / ")
        else if(class(x) == "numeric" || class(x) == "integer")
           paste(min(x), max(x), sep = " - ")
        else
           class(x)),```

function(dat){
dfr <- data.frame(
row.names = c(1:length(colnames(dat))),
ColumnNames = names(dat),
class = sapply(dat, class),
Range = sapply(dat, function(x)
  if(class(x) == "character")
           x[1]
        else if(class(x) == "numeric" || class(x) == "integer")
           paste(min(x), max(x), sep = " - ")
        else
           class(x)),```

Я ожидаю, что на выходе data.frame будут указаны уникальные значения, которые мне требуются в столбце Range, однако я получаю следующее сообщение об ошибке:

Error in data.frame(row.names = c(1:length(colnames(dat))), ColumnNames = 
names(dat),  : 
arguments imply differing number of rows: 68, 6```

Однако, когда я использовал x [1] в качестве функции, он вернул первый элемент столбца, как и ожидалось

1 Ответ

0 голосов
/ 16 июня 2019

В первой функции ОП

paste(unique(x), sep = " / ")

возвращает тот же вывод, что и вход (unique(x)), который может быть вектором длины больше 1. Это единственная строка в функции, которая может возвращать вектор длины больше 1. Код может быть изменен до

paste(unique(x), collapse = " / ")

Разница воспроизводима с

paste(1:3, sep=' / ')
#[1] "1" "2" "3"  # returns the same length
paste(1:3, collapse=" / ")
#[1] "1 / 2 / 3" # single string
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...