直接使用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
作为文本而不是变量传递到循环中。
任何帮助将不胜感激。谢谢。
答案 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()
。