当前位置: 首页 > 知识库问答 >
问题:

将长数据格式转换为宽格式

翟京
2023-03-14

我需要将长数据格式(long)转换为宽格式(wide),条件如下(如果可能):

1) 所有数据文件都将是具有相同结构(id、名称、值)的长格式(long),但每个数据文件将具有不同的变量、值和变量数:

id = case
name = variable
value = variable value(s)

2) 每个数据文件将是不同的变量混合物(因子、整数、数字)。有些因素可能每个案例都有多个级别(从长远来看是水果和肉),我想为这些因素中的每个级别创建一个单独的虚拟变量(逻辑)。因子和数值变量的数量将因数据文件而异。

3)鉴于每个数据文件的变量都不同,我希望将其自动化,我可以将相同的代码应用于每个数据文件而无需更改任何变量名称。

我试过Reformae2和tidyr,但想不出一个方法来完成它。

这是长格式:

    long
   id   name     value
1   1  fruit     apple
2   1  fruit    banana
3   1  fruit    orange
4   1  fruit pineapple
5   1   meat     steak
6   1   meat   chicken
7   1  fname      dave
8   1     wt       185
9   1 status    active
10  2  fruit     apple
11  2  fruit pineapple
12  2   meat   chicken
13  2  fname      jeff
14  2     wt       205
15  2 status    active
16  3  fruit     apple
17  3  fruit    banana
18  3   meat     steak
19  3  fname      jane
20  3     wt       125
21  3 status    lapsed

这是我更喜欢的宽幅格式:

wide
  id fruit.apple fruit.banana fruit.orange fruit.pineapple meat.steak meat.chicken fname  wt status
1  1        TRUE         TRUE         TRUE            TRUE       TRUE         TRUE  dave 185 active
2  2        TRUE        FALSE        FALSE            TRUE      FALSE         TRUE  jeff 205 active
3  3        TRUE         TRUE        FALSE           FALSE       TRUE        FALSE  jane 125 lapsed

长格式数据:

long <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L), name = c("fruit", 
"fruit", "fruit", "fruit", "meat", "meat", "fname", "wt", "status", 
"fruit", "fruit", "meat", "fname", "wt", "status", "fruit", "fruit", 
"meat", "fname", "wt", "status"), value = c("apple", "banana", 
"orange", "pineapple", "steak", "chicken", "dave", "185", "active", 
"apple", "pineapple", "chicken", "jeff", "205", "active", "apple", 
"banana", "steak", "jane", "125", "lapsed")), .Names = c("id", 
"name", "value"), class = "data.frame", row.names = c(NA, -21L
))

共有1个答案

卓雅达
2023-03-14

解决方案使用dplyrtidyr

library(dplyr)
library(tidyr)

wide <- long %>%
  mutate(value2 = ifelse(name %in% c("fruit", "meat"), "1", value),
         name2 = ifelse(name %in% c("fruit", "meat"), 
                       paste(name, value, sep = "."), name)) %>%
  select(-name, -value) %>%
  spread(name2, value2, fill = "0") %>%
  mutate_at(vars(matches("fruit|meat")), as.numeric) %>%
  mutate_at(vars(matches("fruit|meat")), as.logical)
 类似资料:
  • 问题内容: 我有一些格式的数据: 我需要将其转换为格式 如何在SQL中执行此操作? 问题答案: 如果您的得分列是固定的,并且不需要汇总,则可以使用多个和语句来生成所需的数据形状。例如 SQL小提琴:http://sqlfiddle.com/#!6 / f54b2 / 4/0

  • 问题内容: 我正在尝试将Shift_JIS格式的文件转换为UTF-8格式。为此,下面是我的方法: 读取Shift_JIS文件 每行的getBytes并将其转换为UTF-8 创建新文件并将UTF-8转换后的值写入该文件 问题是在第2步中没有发生转换。我正在使用下面的代码将Shift_JIS转换为UTF-8: 请让我知道是否需要其他信息。 我有以下两个 问题 : 1.还有其他更好的方法(步骤)来执行此

  • Excel转KML        在“数据处理”菜单栏中,点击“Excel转KML”,弹出对话框,点击打开XLS,选择要转换的Excel文件(可以添加LSV文件夹下示例数据中的EXCEL2KML示例数据.xls进行测试),读取完成后,可以在上方的表格里看到Excel里的信息。在Excel表格内容的下面分了两块,左侧一块为经纬度和气泡内容的选择,右侧一块是对要生成的kml图层的风格的设置。    

  • 我对Spark SQL很陌生。在执行一项培训任务时,我遇到了以下问题,无法找到答案(以下所有示例都有点愚蠢,但出于演示目的,应该仍然可以)。 我的应用程序读取拼花文件并根据其内容创建数据集: 数据集。show()调用结果: 然后,我将数据集转换为一个新的数据集,其中包含Person类型: 哪里 最后,当我显示数据集的内容时,我希望看到 然而,我明白了 这是toString()方法的结果,而标头是正

  • 问题内容: 我尝试使用json格式的文件作为输入。这是示例数据的片段。 可以在r中使用这种复杂的json格式制作一个csv,以便更平滑地处理数据吗? 例如,有以下基本类别:基本信息照片创建者位置类别网址 可以制作带有basic_information.id,creator.id等子类别类别的csv文件吗? 问题答案: 在研究您的答案时,我在评论中张贴了一些链接,但现在我非常确信这是解决问题的方法。

  • 我有一个宽格式的数据框,在不同的日期范围内进行重复测量。在我的示例中,有三个不同的周期,都有相应的值。例如,第一个测量值()是在从到的周期内测量的: 我希望将数据重塑为长格式,以便对DateRangeXStart和DateRangeXEnd列进行分组,。因此,原始表中的1行变成了新表中的3行: 我知道必须有一个方法来做到这一点与///,但我似乎无法弄清楚如何映射多组测量变量到单组值列以这种特殊的方