如何从数据框中的每一列(数字和字符串)中提取唯一值并将其合并为一列?
a = c("a", "b", "c", "d", "a")
b = c(1, 2, 3, 4, 3)
df <- cbind(a, b)
首选输出为:
variable Level
a a
a b
a c
a d
b 1
b 2
b 3
b 4
上面的示例数据很简单,但目的是能够将答案用于具有不同列名和数据的多个数据框。谢谢。
答案 0 :(得分:4)
Tidyr的gather
和dplyr的distinct
为您提供了快速获得该结构的方法。 (我把函数中的包调用留在了函数中,这样你就能记住哪一个是哪个包,我总是忘记了。)
library(tidyverse)
a = c("a", "b", "c", "d", "a")
b = c(1, 2, 3, 4, 3)
data.frame(a,b) %>% tidyr::gather() %>% dplyr::distinct()
key value
1 a a
2 a b
3 a c
4 a d
5 b 1
6 b 2
7 b 3
8 b 4
答案 1 :(得分:2)
我们将其放在list
中,获取unique
个元素,使用letters
设置名称,然后将stack
设置为data.frame
d1 <- stack(setNames(lapply(list(a, b), unique), letters[1:2]))[2:1]
colnames(d1) <- c('variable', 'Level')
答案 2 :(得分:1)
df
data.frame creation:
a = c("a", "b", "c", "d", "a")
b = c(1, 2, 3, 4, 3)
df <- cbind(a, b)
列名提取
names<-colnames(df)
数据提取
variable<-NULL
Level<-NULL
for(i in 1:length(names))
{
variable<-c(variable,rep(names[i],length(unique(df[,i]))))
Level<-c(Level,unique(df[,i]))
}
您的通用输出
db<-cbind(variable,Level)
db
variable Level
[1,] "a" "a"
[2,] "a" "b"
[3,] "a" "c"
[4,] "a" "d"
[5,] "b" "1"
[6,] "b" "2"
[7,] "b" "3"
[8,] "b" "4"