创建抽象名称和总结时间变量
creating abstract names and summarizing time variables
我有一个数据框,我想将其中一列转换为字母 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,它告诉每个人花费的时间总和。有什么想法吗?
可以分两步完成。
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
使用 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))
)
为了使其通用并自动适应不同的人数:
- 获取使用人数
uniques()
- 生成字母列表(参见此 post)
- 使用
list()
创建关联列表
- 按照之前的回答加入
- dyplyr 聚合
我有一个数据框,我想将其中一列转换为字母 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,它告诉每个人花费的时间总和。有什么想法吗?
可以分两步完成。
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
使用 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))
)
为了使其通用并自动适应不同的人数:
- 获取使用人数
uniques()
- 生成字母列表(参见此 post)
- 使用
list()
创建关联列表
- 按照之前的回答加入
- dyplyr 聚合