Хранение уникальных значений каждого столбца (из df) в списке - PullRequest
0 голосов
/ 25 января 2019

Получить уникальные значения столбца с помощью unique просто. Тем не менее, я хочу сделать то же самое, но для нескольких столбцов в кадре данных и сохранить их в списке, все с использованием базы R. Важно, что мне нужны не комбинации, а просто уникальные значения для каждого отдельного столбца , В настоящее время у меня есть ниже:

# dummy data
df = data.frame(a = LETTERS[1:4]
                ,b = 1:4)

# for loop
cols = names(df)
unique_values_by_col = list()
for (i in cols)
{
  x = unique(i)
  unique_values_by_col[[i]] = x
}

Проблема возникает при отображении unique_values_by_col, поскольку оно отображается пустым. Я считаю, что проблема в том, что i передается в цикл как текст, а не переменная. Любая помощь будет принята с благодарностью. Спасибо.

Ответы [ 4 ]

0 голосов
/ 25 января 2019

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

apply(df,2,unique)

результат:

> apply(df,2,unique)
     a   b
[1,] "A" "1"
[2,] "B" "2"
[3,] "C" "3"
[4,] "D" "4"

подумал, если вы хотите список lapply вернет вам список, так что может быть лучше

0 голосов
/ 25 января 2019

Может ли это быть тем, что вы пытаетесь сделать?

Map(unique,df)

Результат:

$a
[1] A B C D
Levels: A B C D

$b
[1] 1 2 3 4
0 голосов
/ 25 января 2019

Ваша for петля почти правильная, просто нужно одно исправление для работы:

# for loop
cols = names(df)
unique_values_by_col = list()
for (i in cols) {
  x = unique(df[[i]])
  unique_values_by_col[[i]] = x
}
unique_values_by_col
# $a
# [1] A B C D
# Levels: A B C D
# 
# $b
# [1] 1 2 3 4

i это просто символ, имя столбца внутри df, поэтому unique(i) не имеет смысла.


Во всяком случае, самый стандартный способ для этой задачи - lapply(), как показано demirev.

0 голосов
/ 25 января 2019

Почему бы не избежать цикла for в целом, используя lapply:

lapply(df, unique)

В результате:

> $a
> [1] A B C D
> Levels: A B C D

> $b
> [1] 1 2 3 4
...