将一维数据框转换为二维数据框。

3

我将获得一个一维数据框作为输入:

A,1,B,2,C,3,D,4

我需要将其转换为如下的二维数据框:

A,1
B,2
C,3
D,4

我该怎么做?因为数据框中包含非数字值,我无法使用matrix(...)

【编辑】根据要求提供数据的dput

structure(list(V1 = structure(1L, .Label = "A", class = "factor"), 
V2 = 1, V3 = structure(1L, .Label = "B", class = "factor"), 
V4 = 2, V5 = structure(1L, .Label = "C", class = "factor"), 
V6 = 3, V7 = structure(1L, .Label = "D", class = "factor"), 
V8 = 4), .Names = c("V1", "V2", "V3", "V4", "V5", "V6", 
"V7", "V8"), class = "data.frame", row.names = c(NA, -1L))

3
data.frame(matrix(t(d), ncol=2, byrow=TRUE)) 这个命令可以接近你的目标 - 你需要将第二列转换为数值型数据(我猜是这样的)。 - user20650
3个回答

2
您可以使用逻辑向量来从1D数据框中提取列,这些向量将在列中循环使用。
data.frame(x = unlist(d[ , c(TRUE, FALSE)]), y = unlist(d[ , c(FALSE, TRUE)]))
#    x y
# V1 A 1
# V3 B 2
# V5 C 3
# V7 D 4

这个可以,谢谢。是否有更通用的解决方案,将数据转换为一个具有 n 列的二维数据框,给定特定的 n - Carsten
1
我认为@user20650提出的解决方案比我的更好。只需要添加 ncol = n,例如 d <- data.frame(matrix(1:9, nrow = 1)); data.frame(matrix(t(d), ncol=3, byrow=TRUE)) - Henrik

0

matrix 函数的参数 byrow 在这里很有帮助。然后您可以在之后更改类别。

data <- data.frame(matrix(c("A",1,"B",2,"C",3,"D",4),ncol=2,byrow=T))
class(data$X1) <- "numeric"

sapply(data,class)
       X1        X2 
"integer"  "factor"

我很困惑。你的例子可以运行,但是当我使用我的实际数据时它就不能工作了。如果我使用 matrix(...),所有的字符串都会被替换为 1 - Carsten
@Carsten,你用一个数据框(即列表)来填充matrix,然后得到一个列表矩阵。检查str(matrix(the1Ddataframe, ncol = 2, byrow = TRUE))。在1D矩阵中,被称为factor类的'characters'会以它们底层的数值表示打印出来。 - Henrik
直到你放上了 dput,我才意识到它们都是因素。 - Mike.Gahan
@Mike.Gahan 我也一样 :-). - Carsten

0
> matrix( sapply(dat,as.character), 4, byrow=TRUE)
     [,1] [,2]
[1,] "A"  "1" 
[2,] "B"  "2" 
[3,] "C"  "3" 
[4,] "D"  "4" 

如果我们可以假设你请求的“n”作为列号是它可能取值的(数值)因子:

> matrix( sapply(dat,as.character), length(dat)/2, byrow=TRUE)
     [,1] [,2]
[1,] "A"  "1" 
[2,] "B"  "2" 
[3,] "C"  "3" 
[4,] "D"  "4" 

显然,如果第二列需要是数字类,则需要将其强制转换为数据框,但您的问题描述中没有任何提示表明应该是这种情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接