在R中合并具有不同列名的多个列并转置数据

时间:2015-02-27 19:31:51

标签: r

这是我第一次在这里发帖,我是R的新手,所以希望我正确地提出我的问题。我正在尝试根据另外两个变量在Name中创建一个新变量Daydataset)。我的数据如下所示:

ID  Name    Day
1   Abbey   06-Jan-2009
2   Abbey   07-Jan-2009
3   Abbey   06-Jan-2009
4   Abbey   07-Jan-2009
5   Fred    09-Jan-2009
6   Fred    10-Jan-2009
7   Fred    09-Jan-2009
8   Fred    10-Jan-2009

我希望新变量看起来像这样:

ID  Name    Day           Time
1   Abbey   06-Jan-2009   1
2   Abbey   07-Jan-2009   2
3   Abbey   06-Jan-2009   1
4   Abbey   07-Jan-2009   2
5   Fred    09-Jan-2009   1
6   Fred    10-Jan-2009   2
7   Fred    09-Jan-2009   1
8   Fred    10-Jan-2009   2

我试过了:

dataset$Time<-as.numeric (as.factor(dataset$Name),(as.factor(dataset$Day)))

但是,对于每个变量,这并不会将时间重新设置为1。提前谢谢!

4 个答案:

答案 0 :(得分:2)

尝试:

transform(dataset, Time=c(ave(as.character(Day), Name, FUN=factor)))

您可能需要也可能不需要as.character,具体取决于您的数据是以字符还是因素开头。请注意,我们使用c来删除因子属性。

答案 1 :(得分:2)

使用data.table

的选项
library(data.table)#data.table_1.9.5
setDT(df1)[, id:=frank(Day, ties.method='dense'),.(Name)][]
#   ID  Name         Day id
#1:  1 Abbey 06-Jan-2009  1
#2:  2 Abbey 07-Jan-2009  2
#3:  3 Abbey 06-Jan-2009  1
#4:  4 Abbey 07-Jan-2009  2
#5:  5  Fred 09-Jan-2009  1
#6:  6  Fred 10-Jan-2009  2
#7:  7  Fred 09-Jan-2009  1
#8:  8  Fred 10-Jan-2009  2

答案 2 :(得分:0)

我认为使用dplyr

会相当容易
dd<-data.frame(
    ID=1:8,
    Name=c("Abbey", "Abbey", "Abbey", "Abbey", "Fred", "Fred", "Fred", "Fred"),
    Day=c("06-Jan-2009", "07-Jan-2009", "06-Jan-2009", "07-Jan-2009", "09-Jan-2009", "10-Jan-2009", "09-Jan-2009", "10-Jan-2009")
)

library(dplyr)
dd %>% group_by(Name) %>% mutate(id=as.numeric(factor(Day)))

#   ID  Name         Day id
# 1  1 Abbey 06-Jan-2009  1
# 2  2 Abbey 07-Jan-2009  2
# 3  3 Abbey 06-Jan-2009  1
# 4  4 Abbey 07-Jan-2009  2
# 5  5  Fred 09-Jan-2009  1
# 6  6  Fred 10-Jan-2009  2
# 7  7  Fred 09-Jan-2009  1
# 8  8  Fred 10-Jan-2009  2

答案 3 :(得分:0)

我的回答与MrFlick相似。注意日期 - 它们可以是日期或字符格式......

# Uncomment if dplyr not installed
# install.packages(dplyr)
library(dplyr)
ID <- 1:8
Name <- rep(c("Abbey", "Fred"), times=c(4,4))
Day <- c("06-Jan-2009", "07-Jan-2009","06-Jan-2009", "07-Jan-2009",
         "09-Jan-2009", "10-Jan-2009","09-Jan-2009", "10-Jan-2009")

dataset <- data.frame(ID, Name, Day)

dataset <- 
  group_by(dataset, Name) %>%
  mutate(Time = as.numeric(as.factor((as.Date(Day, "%d-%b-%Y")))))