在列表中存储(df)每一列的唯一值

时间:2019-01-25 10:23:20

标签: r for-loop unique

直接使用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 :(得分:2)

为什么不使用lapply完全避免for循环:

lapply(df, unique)

结果:

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

> $b
> [1] 1 2 3 4

答案 1 :(得分:2)

或者您还有apply专门用于在列或行上运行:

apply(df,2,unique)

结果:

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

如果想要列表lapply返回列表,可能会更好

答案 2 :(得分:1)

这就是您要尝试的吗?

Map(unique,df)

结果:

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

$b
[1] 1 2 3 4

答案 3 :(得分:1)

您的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)毫无意义。


无论如何,如demirev所示,完成此任务的最标准方法是lapply()