我有一个数据框,我想将其中一个列转换为字母A,B,C,D并创建一个汇总时间:
ticket <- c('1-5444', '1-5444', '1-5444', '1-5444', '1-5444', '1-5444', '1-5445')
person <- c('John','John','Kai', 'John', 'Kai', 'Bob', 'John')
time<- c(NA, 1, 2,1, 3, 4, NA)
df <- data.frame(ticket,person,time)
我想创建一个名为z
的抽象变量,它将获取person
列的抽象值。例如,在John-John-Kai-John-Kai-Bob
中,基本上有三个人,因此A-A-B-A-B-C
。所以z
将获取相应演员的值,如下所示:
ticket person time z ztime
1-5444 John NA A 2
1-5444 John 1 A 2
1-5444 Kai 2 B 5
1-5444 John 1 A 2
1-5444 Kai 3 B 5
1-5444 Bob 4 C 4
1-5445 John NA A 0
然后我想计算ztime,它告诉每个人服用的时间总和。有什么想法吗?
答案 0 :(得分:2)
使用StringsAsFactors = TRUE
创建数据框(默认),已经创建了具有3个不同级别的变量person
。您只需要创建新变量:
df <- transform(df,
z = LETTERS[person],
ztime = by(time, person, sum, na.rm = TRUE)[person]
)
或(如评论中所要求的)如果按人和票分组:
df <- transform(df,
z = LETTERS[person],
ztime = ave(time, ticket, person, FUN = function(x) sum(x, na.rm = TRUE))
)
答案 1 :(得分:1)
可以分两步完成。
values <- c("C", "A", "B")
df$z <- values[df$person]
aggr = ddply(df,.(ticket,person),summarize, ztime=sum(time,na.rm=T))
df = join(df,aggr,by=c("ticket","person"),type="left")
View(df)
ticket person time z ztime
1 1-5444 John NA A 2
2 1-5444 John 1 A 2
3 1-5444 Kai 2 B 5
4 1-5444 John 1 A 2
5 1-5444 Kai 3 B 5
6 1-5444 Bob 4 C 4
7 1-5445 John NA A 0
答案 2 :(得分:0)
使其具有通用性并自动适应不同人数:
uniques()
list()