我在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中也是这样吗?
发布于 2013-09-05 19:01:02
我认为,您提供的代码没有精确地复制您的.csv文件。(尝试names(original)看看如何实现)。尝尝这个
original <- read.csv("your_data.csv")
require(reshape2)
new_df <- melt(original, id.vars="Food")发布于 2013-09-06 05:11:56
这个答案有两个目的:
stack表示基R。第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把它放回去。
一般来说,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 Calorieshttps://stackoverflow.com/questions/18643744
复制相似问题