0

我在 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 中做同样的事情的方法吗?

4

2 回答 2

1

这个答案有两个目的:

  1. 在评论中解决如何以更好的方式共享可重现数据的问题。
  2. 用 表示基数stackR。

第 1 部分:数据创建。

请注意,这些数字没有被引用,我们可以data.frame直接将它们放在 a 中。这意味着在试图回答您的问题的人们的工作空间中乱扔垃圾的物品更少

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

替代解决方案

“重塑”过程可以stack从基础 R 完成。在堆叠数据时删除第一列。用来cbind放回去。

一般来说,stack比 快melt。还有,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
于 2013-09-06T05:11:56.020 回答
1

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

original <- read.csv("your_data.csv")
require(reshape2)
new_df <- melt(original, id.vars="Food")
于 2013-09-05T19:01:02.180 回答