我在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中做同样的事情?
答案 0 :(得分:1)
我认为您提供的代码不会精确地重现您的.csv
文件。 (尝试names(original)
看看如何)。试试这个
original <- read.csv("your_data.csv")
require(reshape2)
new_df <- melt(original, id.vars="Food")
答案 1 :(得分:1)
这个答案有两个目的:
stack
表示基础R. 请注意,这些数字没有引用,我们可以直接将它们放在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
将其重新插入。
通常,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