R操纵数据框枢轴

时间:2013-09-05 18:47:20

标签: r reshape

我在csv文件中有一些数据,如下所示。

Food            Calories    Cholesterol Total_Fat   Sodium 
Frozen_Broccoli 73.8            0           0.8         68.2 
Carrots,Raw 74.8            23.7            0           0.1

创建该数据的代码(在下面的用户Drew Steen发表评论后更新代码):

Food=c('Frozen Broccoli',   'Carrots,Raw')
Cholesterol=c('0',  '23.7')
Total_Fat=c('0.8',  '0')
Sodium=c('68.2',    '0.1')
Calories=c('73.8',  '74.8')
Food=c('Frozen Broccoli',   'Carrots,Raw')
original=data.frame(Food, Cholesterol,Total_Fat,Sodium,Calories)
View(original)

我想转置部分数据,使其如下所示。

Frozen_Broccoli    Calories X73.8
Frozen_Broccoli Cholesterol   0.0
Frozen_Broccoli   Total_Fat   0.8
Frozen_Broccoli      Sodium  68.2
Carrots,Raw    Calories  74.8
Carrots,Raw Cholesterol  23.7
Carrots,Raw   Total_Fat   0.0
Carrots,Raw      Sodium   0.1

我可以使用Excel和vba创建数据。但他们是否可以在R中做同样的事情?

2 个答案:

答案 0 :(得分:1)

我认为您提供的代码不会精确地重现您的.csv文件。 (尝试names(original)看看如何)。试试这个

original <- read.csv("your_data.csv")
require(reshape2)
new_df <- melt(original, id.vars="Food")

答案 1 :(得分:1)

这个答案有两个目的:

  1. 在评论中解决如何以更好的方式共享可再现数据的问题。
  2. stack表示基础R.
  3. 第1部分:数据创建。

    请注意,这些数字没有引用,我们可以直接将它们放在data.frame中。这意味着在试图回答您问题的人的工作区中乱扔垃圾的对象越来越少

    original <- data.frame(
      Food = c('Frozen Broccoli', 'Carrots,Raw'),
      Cholesterol = c(0, 23.7), 
      Total_Fat = c(0.8, 0),
      Sodium = c(68.2, 0.1),
      Calories = c(73.8, 74.8))
    original
    #              Food Cholesterol Total_Fat Sodium Calories
    # 1 Frozen Broccoli         0.0       0.8   68.2     73.8
    # 2     Carrots,Raw        23.7       0.0    0.1     74.8
    

    另一种解决方案

    可以使用基础R中的stack完成“整形”过程。在堆叠数据时删除第一列。使用cbind将其重新插入。

    通常,stackmelt快。还有unlist但这对于这个特殊问题来说非常麻烦。

    cbind(original[1], stack(original[-1]))
    #              Food values         ind
    # 1 Frozen Broccoli    0.0 Cholesterol
    # 2     Carrots,Raw   23.7 Cholesterol
    # 3 Frozen Broccoli    0.8   Total_Fat
    # 4     Carrots,Raw    0.0   Total_Fat
    # 5 Frozen Broccoli   68.2      Sodium
    # 6     Carrots,Raw    0.1      Sodium
    # 7 Frozen Broccoli   73.8    Calories
    # 8     Carrots,Raw   74.8    Calories