将行数据转换为带键列的单列

Posted

技术标签:

【中文标题】将行数据转换为带键列的单列【英文标题】:Convert Row Data into Single Column w/ Key Column 【发布时间】:2020-10-02 17:49:00 【问题描述】:

我想使用 SQL 或 R 将原始行数据中的行数据转换为具有键列的单列。

示例行:

---------------------------------------------------------------------
| Customer #  | Item1   |   Item2   |   Item3  |  Item4 |
---------------------------------------------------------------------
| 1111111     | A12345  |   C45567  |   G34589 | A34529 |
---------------------------------------------------------------------

这是我想要的结果:

   -------------------------------
   | Customer # | Columnname | Value    |
   -------------------------------
   | 1111111    | Item1      | A12345   |
   | 1111111    | Item2      | C45567   |
   | 1111111    | Item3      | G34589   |
   | 1111111    | Item4      | A34529   |

【问题讨论】:

在 R 中,您可以直接使用 reshape: reshape(df, varying=names(df)[-1], times=names(df)[-1], v.names="Value", timevar="Columnname", ids=NULL, new.row.names=1:1E5, direction="long") 【参考方案1】:

您希望将表中的列反透视为行。

您标记了问题mysqli,所以让我假设您使用的是 MySQL。在这个数据库中,你可以使用union all

select customer, 'Item1' columname, Item1 value from mytable
union all select customer, 'Item2', Item2 from mytable
union all select customer, 'Item3', Item3 from mytable
union all select customer, 'Item4', Item4 from mytable

其他数据库有更简洁的解决方案,通常使用横向连接和values()。以 Postgres 为例:

select t.customer, x.columname, x.value
from mytable t
cross join lateral (values 
    ('Item1', Item1), ('Item2', Item2), ('Item3', Item3), ('Item4', Item4)
) x(columname, value)

在 SQL Server 中,您只需将 cross join lateral 替换为 cross apply

【讨论】:

【参考方案2】:

在 R 中,您可以使用 dplyr 和 tidyr,如下所示。

library(dplyr)
library(tidyr)

data <- tibble(customer = c(11111),
               item1 = c('sfdhdshv'),
               item2 = c('dfh'),
               item3 = c('kjg'))

data

#   customer item1    item2 item3
#      <dbl> <chr>    <chr> <chr>
# 1    11111 sfdhdshv dfh   kjg 

data %>%
  pivot_longer(!customer, names_to = 'columnname', values_to = 'value')

#   customer columnname value   
#      <dbl> <chr>      <chr>   
# 1    11111 item1      sfdhdshv
# 2    11111 item2      dfh     
# 3    11111 item3      kjg

【讨论】:

r 中的关键是你不能有一个名为customer # 的列,# 不能在那里 data.frame('Customer #' = 1, check.names = FALSE)[, 'Customer #']@ChuckP 哈哈,好吧,是的,你可以四处走走,但你在路上自找麻烦

以上是关于将行数据转换为带键列的单列的主要内容,如果未能解决你的问题,请参考以下文章

建议将行转换为列的方法

Mysql查询根据两列动态将行转换为列

将行转换为列的 MS SQL 连接查询

使用 NHibernate 将行转换为属性/列

MySQL - 根据每列的最新日期和 id 列表将行转换为列

Json数据,转换规则,