【问题标题】:Converting a Table to a List of Values将表转换为值列表
【发布时间】:2015-10-06 20:20:04
【问题描述】:

我正在使用 sm 包中的函数 binning 来获取绘制的 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

我的“频率”表的输出格式...

       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 循环的每次迭代都会附加到这个向量...但是有超过 340 万个 bin,这个过程需要几个小时。

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

有人可以推荐一个更优雅的解决方案吗?有没有更直接的方法将表格转换为列表?我是 R 的新手,也许我在这里错误地使用了术语“表”和“列表”。我希望上面给出的格式有助于澄清我的问题。

'dput(频率)'的输出

将以下答案应用于我的数据时遇到了一些麻烦,这些数据没有 x1,x2,y1,y2 作为实际的行和列标题名称。我用这些来试图表达我的观点,但似乎引起了更多的混乱。为此,我深表歉意。使用@neerajt 提供的小矩阵...我不明白输出以及为什么给出 count.1、count.2 和 count.3。这些“计数”列都不能与 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

【问题讨论】:

  • 你能dput频率吗
  • 你试过as.data.frame(frequency)吗?
  • as.data.frame 没有将表中的数据结构更改为 3 列 (x,y,z) data.frame。
  • 有没有办法可以发布我的“频率”输出表?我找不到将其插入原始问题的方法。我既是 R 新手,也是 SO 新手。他们俩都很棒!!!
  • 你能用dput(frequency[1:5, 1:5]) 的输出编辑你的问题吗,正如迈克尔斯的建议,我认为应该有效

标签: r list dataframe


【解决方案1】:

您可以尝试以下方法。如果您有一个如下所示的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) 是 wide 格式,而您的表格're going for (z) 是 long 格式。 This article 很好地说明了这个想法。

【讨论】:

    【解决方案2】:

    'binning' 操作的输出频率表生成了一个不是 data.frame 的表,因此使用 unlist() 函数将无法正常工作,直到将其应用为 as.data.frame(frequency)。

    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 提出的复制函数需要包含“每个”函数才能创建正确的 x,y 坐标列表,这样它就会对应于“unlist()”的准备方式计数数据作为向量。

    unlist() 提供了将数小时的计算时间变成几秒钟的关键。谢谢大家的帮助。

    【讨论】:

      猜你喜欢
      • 2015-06-08
      • 1970-01-01
      • 2011-12-22
      • 2022-08-17
      • 2016-11-30
      • 2018-11-06
      • 1970-01-01
      相关资源
      最近更新 更多