将表转换为值列表

时间:2015-10-02 14:45:13

标签: r list dataframe

我正在使用binning包中的函数sm来绘制x,y坐标并将它们放入离散的bin中。这将创建一个频率表,其中bin的数量由SampleSize的用户输入确定。

    num_bins <- max(x_max,y_max)/SampleSize
    bin_breaks <- matrix(c(bins,bins), num_bins+1,2)
    frequency <- binning(combo_points,breaks=bin_breaks,nbins=num_bins)$table.freq

输出我的频率&#39;表的格式为......

       x1  x2  x3  x4  x5...
    y1  0   5
    y2  0
    y3  0
    y4
    y5
    .
    .
    .

但是我需要将它转换为x和y的所有值的列表格式......

    x  y  count
    1  1  0
    1  2  0
    1  3  0
    2  1  5
    .  .  .
    .  .  .

我想将此表转换为x,y,count的data.frame列表,其中x和y现在实际上只是bin本身的x,y坐标。我目前正在通过设置data.frame来列出bin坐标(freq_points $ x和freq_points $ y),然后运行for循环来搜索表中与每个值相匹配的数据。我的freq_points data.frame的一行创建一个新的向量(z)for for循环的每次迭代附加到...但是有超过340万个bin,这个过程需要几个小时。

    for (i in 1:length(frequency)){
    z<-append(z,frequency[freq_points$y[i],freq_points$x[i]])}

有人可以推荐更优雅的解决方案吗?是否有更直接的方法从表转换为列表?我在R中很新,也许我使用的是“表格”和“#39;和&#39;列出&#39;这里不正确。我希望上面给出的格式有助于澄清我的问题。

输出来自&#39;输出(频率)&#39; output from 'dput(frequency)'

将以下答案应用于我的数据时遇到了一些问题,而这些数据没有x1,x2,y1,y2作为实际的行和列标题名称。我正在使用那些试图弄清楚我的观点,但似乎引起了更多的困惑。为此,我道歉。使用@neerajt提供的小矩阵...我不理解输出以及为什么给出count.1,count.2和count.3。这些都不算数&#39;列可以与x,y坐标一起使用。你能否对此有所了解?

    freq <- matrix(c(0,0,1,5,0,1,1,0,1,1,1,0),nrow=4,ncol=3)
    freq
         [,1] [,2] [,3]
    [1,]    0    0    1
    [2,]    0    1    1
    [3,]    1    1    1
    [4,]    5    0    0

    counts <- unlist(freq)
    xname <- rep(c(1:ncol(freq)),nrow(freq))
    yname <- rep(c(1:nrow(freq)),ncol(freq))
    z <- data.frame(x=xname, y=yname, count=counts, row.names=NULL)
    z
       x y count.1 count.2 count.3
    1  1 1       0       0       1
    2  2 2       0       1       1
    3  3 3       1       1       1
    4  1 4       5       0       0
    5  2 1       0       0       1
    6  3 2       0       1       1
    7  1 3       1       1       1
    8  2 4       5       0       0
    9  3 1       0       0       1
    10 1 2       0       1       1
    11 2 3       1       1       1
    12 3 4       5       0       0

2 个答案:

答案 0 :(得分:0)

这是你可以尝试的东西。如果您有一个freq表,如下所示:

freq = data.frame(x1=c(0,0,1,5), x2=c(0,1,1,0), x3=c(1,1,1,0))
row.names(freq) <- c("y1", "y2", "y3", "y4")

   x1 x2 x3
y1  0  0  1
y2  0  1  1
y3  1  1  1
y4  5  0  0

然后

counts = unlist(freq)

xname = rep(names(freq), nrow(freq))

yname = rep(row.names(freq), length(freq))

z = data.frame(x = xname, y = yname, count = counts, row.names=NULL)

z将返回

    x  y count
1  x1 y1     0
2  x2 y2     0
3  x3 y3     1
4  x1 y4     5
5  x2 y1     0
6  x3 y2     1
7  x1 y3     1
8  x2 y4     0
9  x3 y1     1
10 x1 y2     1
11 x2 y3     1
12 x3 y4     0

希望能让你走近。主要的内容是unlist()操作。

当涉及到术语时,两者都是表格,或者更具体地说是R中的data.frames。区别在于您的原始表格(frequency)是格式,您(z)的表格是格式。 This article很好地说明了这个想法。

答案 1 :(得分:0)

来自&#39; binning&#39;的输出频率表操作产生的表不是data.frame,因此在将其应用为.data.frame(频率)之前,使用unlist()函数将无法正常工作。

xname <- rep(1:ncol(frequency),times=1,each=nrow(frequency))
yname <- rep(1:nrow(frequency),times=ncol(frequency),each=1)
z <- unlist(as.data.frame(frequency))
df <- data.frame(x=xname, y=yname, z=count)

另外,请注意@neerajt提议的复制功能需要包括每个&#39;函数以创建正确的x,y坐标列表,以便它对应于'unlist()&#39;的方式。准备计数数据作为矢量。

unlist()提供了将计算时间转换为几秒钟的关键。谢谢大家的帮助。