将矩阵(或表)转换为表格列表?

发布于 2025-02-05 07:58:26 字数 736 浏览 5 评论 0原文

我想将数据集转换为表列表(我不知道它叫什么),但这是一个示例(显然,初始数据集更大得多)。 初始数据:

StationSP1SP2SP3
2011
10030
34000 0
53035
56603
57100 0
621810

和我想要的:

“

谢谢

I want to transform my dataset into a table-list (I don't know what it's called) but here's an example (obviously the initial dataset is much larger).
initial data :

stationSP1SP2SP3
2011
10030
34000
53035
56603
57100
621810

and what I would like :

final table

thank you

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一桥轻雨一伞开 2025-02-12 07:58:26

推断您不需要0行,这只是一个枢轴/过滤器2步。

基本R和reshape2

longdat <- reshape2::melt(dat, "station", variable.name = "sp", value.name = "number")
longdat
#    station  sp number
# 1        2 SP1      0
# 2       10 SP1      0
# 3       34 SP1      0
# 4       53 SP1      0
# 5       56 SP1      6
# 6       57 SP1      1
# 7       62 SP1      1
# 8        2 SP2      1
# 9       10 SP2      3
# 10      34 SP2      0
# 11      53 SP2      3
# 12      56 SP2      0
# 13      57 SP2      0
# 14      62 SP2      8
# 15       2 SP3      1
# 16      10 SP3      0
# 17      34 SP3      0
# 18      53 SP3      5
# 19      56 SP3      3
# 20      57 SP3      0
# 21      62 SP3     10
subset(longdat, number > 0)
#    station  sp number
# 5       56 SP1      6
# 6       57 SP1      1
# 7       62 SP1      1
# 8        2 SP2      1
# 9       10 SP2      3
# 11      53 SP2      3
# 14      62 SP2      8
# 15       2 SP3      1
# 18      53 SP3      5
# 19      56 SP3      3
# 21      62 SP3     10

dplyr

library(dplyr)
dat %>%
  pivot_longer(-station, names_to = "sp", values_to = "number") %>%
  dplyr::filter(number > 0)
# # A tibble: 11 x 3
#    station sp    number
#      <int> <chr>  <int>
#  1       2 SP2        1
#  2       2 SP3        1
#  3      10 SP2        3
#  4      53 SP2        3
#  5      53 SP3        5
#  6      56 SP1        6
#  7      56 SP3        3
#  8      57 SP1        1
#  9      62 SP1        1
# 10      62 SP2        8
# 11      62 SP3       10

data.table

(实际上与reshape2。)

library(data.table)
data.table::melt(as.data.table(dat), "station", variable.name = "sp", value.name = "number"
   )[ number > 0, ]
#     station     sp number
#       <int> <fctr>  <int>
#  1:      56    SP1      6
#  2:      57    SP1      1
#  3:      62    SP1      1
#  4:       2    SP2      1
#  5:      10    SP2      3
#  6:      53    SP2      3
#  7:      62    SP2      8
#  8:       2    SP3      1
#  9:      53    SP3      5
# 10:      56    SP3      3
# 11:      62    SP3     10

数据

dat <- structure(list(station = c(2L, 10L, 34L, 53L, 56L, 57L, 62L), SP1 = c(0L, 0L, 0L, 0L, 6L, 1L, 1L), SP2 = c(1L, 3L, 0L, 3L, 0L, 0L, 8L), SP3 = c(1L, 0L, 0L, 5L, 3L, 0L, 10L)), class = "data.frame", row.names = c(NA, -7L))

Inferring that you don't want 0 rows, this is just a pivot/filter 2-step.

base R and reshape2

longdat <- reshape2::melt(dat, "station", variable.name = "sp", value.name = "number")
longdat
#    station  sp number
# 1        2 SP1      0
# 2       10 SP1      0
# 3       34 SP1      0
# 4       53 SP1      0
# 5       56 SP1      6
# 6       57 SP1      1
# 7       62 SP1      1
# 8        2 SP2      1
# 9       10 SP2      3
# 10      34 SP2      0
# 11      53 SP2      3
# 12      56 SP2      0
# 13      57 SP2      0
# 14      62 SP2      8
# 15       2 SP3      1
# 16      10 SP3      0
# 17      34 SP3      0
# 18      53 SP3      5
# 19      56 SP3      3
# 20      57 SP3      0
# 21      62 SP3     10
subset(longdat, number > 0)
#    station  sp number
# 5       56 SP1      6
# 6       57 SP1      1
# 7       62 SP1      1
# 8        2 SP2      1
# 9       10 SP2      3
# 11      53 SP2      3
# 14      62 SP2      8
# 15       2 SP3      1
# 18      53 SP3      5
# 19      56 SP3      3
# 21      62 SP3     10

dplyr

library(dplyr)
dat %>%
  pivot_longer(-station, names_to = "sp", values_to = "number") %>%
  dplyr::filter(number > 0)
# # A tibble: 11 x 3
#    station sp    number
#      <int> <chr>  <int>
#  1       2 SP2        1
#  2       2 SP3        1
#  3      10 SP2        3
#  4      53 SP2        3
#  5      53 SP3        5
#  6      56 SP1        6
#  7      56 SP3        3
#  8      57 SP1        1
#  9      62 SP1        1
# 10      62 SP2        8
# 11      62 SP3       10

data.table

(Effectively the same as reshape2.)

library(data.table)
data.table::melt(as.data.table(dat), "station", variable.name = "sp", value.name = "number"
   )[ number > 0, ]
#     station     sp number
#       <int> <fctr>  <int>
#  1:      56    SP1      6
#  2:      57    SP1      1
#  3:      62    SP1      1
#  4:       2    SP2      1
#  5:      10    SP2      3
#  6:      53    SP2      3
#  7:      62    SP2      8
#  8:       2    SP3      1
#  9:      53    SP3      5
# 10:      56    SP3      3
# 11:      62    SP3     10

Data

dat <- structure(list(station = c(2L, 10L, 34L, 53L, 56L, 57L, 62L), SP1 = c(0L, 0L, 0L, 0L, 6L, 1L, 1L), SP2 = c(1L, 3L, 0L, 3L, 0L, 0L, 8L), SP3 = c(1L, 0L, 0L, 5L, 3L, 0L, 10L)), class = "data.frame", row.names = c(NA, -7L))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文