重复行并在R中创建新数据框

时间:2013-07-12 13:49:15

标签: r

我有一个名为intraPByGroup的R数据框,如下所示:

group, week1, week2, week3, week4
kiwi,23,43,54,23
eggplant,22,32,33,63
jasmine,23,454,12,654
coconut,32,56,22,31

我想要做的是创建一个新的数据框,如下所示

user,week1,week2,week3,week4
eggplantA,22,32,33,63
eggplantB,22,32,33,63
eggplantC,22,32,33,63
jasmineA,23,454,12,654
jasmineB,23,454,12,654
jasmineC,23,454,12,654

基本上,这个想法是:从原始数据集中,我选择两个组(茄子和茉莉花),我想创建一个新的数据帧。这个新数据框有“user”变量而不是“group”。每个用户名实际上是“groupname + A(B或C)”,并且同一组中所有用户的所有其余值都是重复的。

我应该如何在R?中做到这一点?

我想首先删除组名并选择一行,然后组成一个新行,然后对每个选定的组重复执行此操作。

eggFrame <- intraPByGroup[intraPByGroup$group=="eggplant",-1]
eggFrame1 <- eggFrame
eggFrame1["user"] <- "Eggplant-A"
eggFrame2 <- eggFrame
eggFrame2["user"] <- "Eggplant-B"
total <- rbind(eggFrame1,eggFrame2)

我认为反复做rbind是愚蠢的,即使这样,还有其他更快的方法吗?

1 个答案:

答案 0 :(得分:5)

你可以做这样的事情

data <- subset(data, group %in% c("eggplant", "jasmine"))[rep(1:2, each = 3), ]
data$group <- factor(paste0(data$group, LETTERS[1:3]))
data
##          group week1 week2 week3 week4
## 2   eggplantA    22    32    33    63
## 2.1 eggplantB    22    32    33    63
## 2.2 eggplantC    22    32    33    63
## 3    jasmineA    23   454    12   654
## 3.1  jasmineB    23   454    12   654
## 3.2  jasmineC    23   454    12   654

如果出于任何原因你不喜欢这样的rownames而你想将“group”改为“user”

rownames(data) <- NULL
names(data)[1] <- "user"
data
##        user week1 week2 week3 week4
## 1 eggplantA    22    32    33    63
## 2 eggplantB    22    32    33    63
## 3 eggplantC    22    32    33    63
## 4  jasmineA    23   454    12   654
## 5  jasmineB    23   454    12   654
## 6  jasmineC    23   454    12   654