即使值的数量不相同,如何将数据框列中的唯一值放入数据框中
How can I get unique values in dataframe column into a dataframe even though the number of values is not the same
我有一个数据框数据:
Data <- data.frame(A=sample(1:7),B=c(5,5,5,6,6,6,6),C=c(1,2,2,3,3,4,5))
A B C
1 6 5 1
2 7 5 2
3 4 5 2
4 2 6 3
5 1 6 3
6 5 6 4
7 3 6 5
我正在尝试将每个列中的唯一值提取到 data.frame 中。
每列都有一组不同的唯一值和数量。
我正在寻找类似的东西:
A 1 2 3 4 5 6 7
B 5 6 NA NA NA NA NA
C 1 2 3 4 5 NA NA
我能够遍历它并获得包含信息的列表(我尝试使用列表,因为它们的长度不同)
vars <- c('A','B','C')
mylist = vector("list",length(vars))
for(i in 1: length(vars)){
mylist[[i]] <- c( names(table( Data[ , vars[i] ] )))
}
如何将信息放入 data.frame 中,最好不要循环?
谢谢!
lapply()
就足够了。这是我使用的技巧。
xx <- lapply(Data, unique)
data.frame(do.call(rbind, lapply(xx, "length<-", max(vapply(xx, length, 1L)))))
# X1 X2 X3 X4 X5 X6 X7
# A 2 3 6 5 1 7 4
# B 5 6 NA NA NA NA NA
# C 1 2 3 4 5 NA NA
首先,我们遍历 Data
的列以查找所有唯一值。然后我们迭代它,使用 length<-
将每个元素的长度扩展到 xx
的最长元素的长度。然后我们将它们全部整合到一个数据框中。
这是一个可能的data.table
解决方案
library(data.table)
data.frame(t(setDT(Data)[, lapply(.SD, function(x) {
temp <- unique(x)
c(sort(temp),
rep(NA, length(x) - length(temp)))
})]))
# X1 X2 X3 X4 X5 X6 X7
# A 1 2 3 4 5 6 7
# B 5 6 NA NA NA NA NA
# C 1 2 3 4 5 NA NA
我有一个数据框数据:
Data <- data.frame(A=sample(1:7),B=c(5,5,5,6,6,6,6),C=c(1,2,2,3,3,4,5))
A B C
1 6 5 1
2 7 5 2
3 4 5 2
4 2 6 3
5 1 6 3
6 5 6 4
7 3 6 5
我正在尝试将每个列中的唯一值提取到 data.frame 中。 每列都有一组不同的唯一值和数量。
我正在寻找类似的东西:
A 1 2 3 4 5 6 7
B 5 6 NA NA NA NA NA
C 1 2 3 4 5 NA NA
我能够遍历它并获得包含信息的列表(我尝试使用列表,因为它们的长度不同)
vars <- c('A','B','C')
mylist = vector("list",length(vars))
for(i in 1: length(vars)){
mylist[[i]] <- c( names(table( Data[ , vars[i] ] )))
}
如何将信息放入 data.frame 中,最好不要循环? 谢谢!
lapply()
就足够了。这是我使用的技巧。
xx <- lapply(Data, unique)
data.frame(do.call(rbind, lapply(xx, "length<-", max(vapply(xx, length, 1L)))))
# X1 X2 X3 X4 X5 X6 X7
# A 2 3 6 5 1 7 4
# B 5 6 NA NA NA NA NA
# C 1 2 3 4 5 NA NA
首先,我们遍历 Data
的列以查找所有唯一值。然后我们迭代它,使用 length<-
将每个元素的长度扩展到 xx
的最长元素的长度。然后我们将它们全部整合到一个数据框中。
这是一个可能的data.table
解决方案
library(data.table)
data.frame(t(setDT(Data)[, lapply(.SD, function(x) {
temp <- unique(x)
c(sort(temp),
rep(NA, length(x) - length(temp)))
})]))
# X1 X2 X3 X4 X5 X6 X7
# A 1 2 3 4 5 6 7
# B 5 6 NA NA NA NA NA
# C 1 2 3 4 5 NA NA