从数据框中拉出唯一值,并使用r在列上生成

时间:2018-01-25 12:48:16

标签: r data-manipulation

如何从数据框中的每一列(数字和字符串)中提取唯一值并将其合并为一列?

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

上面的示例数据很简单,但目的是能够将答案用于具有不同列名和数据的多个数据框。谢谢。

3 个答案:

答案 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"