合并来自 2 列的信息并形成 2 个具有一半行 r 的新信息
merge info from 2 columns and form 2 new ones with half the rows r
我在论坛的任何地方都找不到解决我的问题的方法,所以我认为不是重复的。
我有一个数据集如下:
> couple bird day calltype Number
1 E m1 d1 tot_s 5
2 E f1 d1 tot_s 2
3 E m1 d3 tot_s 6
4 E f1 d3 tot_s 5
5 E m1 d5 tot_s 3
6 E f1 d5 tot_s 6
7 E m1 d7 tot_s 1
8 E f1 d7 tot_s 7
9 F m1 d1 tot_s 9
10 F f1 d1 tot_s 5
11 F m1 d3 tot_s 10
12 F f1 d3 tot_s 8
13 F m1 d5 tot_s 6
14 F f1 d5 tot_s 7
15 F m1 d7 tot_s 4
16 F f1 d7 tot_s 5
我想将其转换为:
couple1 day1 calltype1 number_m1 number_f1
1 E d1 tot_s 1 2
2 E d3 tot_s 5 7
3 E d5 tot_s 4 7
4 E d7 tot_s 4 4
5 F d1 tot_s 3 6
6 F d3 tot_s 3 2
7 F d5 tot_s 8 8
8 F d7 tot_s 2 2
第一个数据集的可重现示例:
couple<- rep(c("E","F"), each=8)
bird<- rep(c("m1","f1"), 4)
day <- rep(rep(c("d1","d3", "d5", "d7"), each=2),2)
calltype <- rep("tot_s", 16)
Number <- as.numeric(sample(1:10, replace = TRUE, 16))
dat<- data.frame(cbind(couple, bird, day, calltype, Number))
还有第二个:
couple1<- rep(c("E","F"), each=4)
day1 <- rep(c("d1","d3", "d5", "d7"),2)
calltype1 <- rep("tot_s", 8)
number_m1 <- c(dat$Number[1], dat$Number[3], dat$Number[5], dat$Number[7], dat$Number[9], dat$Number[11], dat$Number[13], dat$Number[15] )
number_f1 <- c(dat$Number[2], dat$Number[4], dat$Number[6], dat$Number[8], dat$Number[10], dat$Number[12], dat$Number[14], dat$Number[16] )
dat1<- data.frame(cbind(couple1, day1, calltype1, number_m1, number_f1))
它可行的策略是合并 2 列
然后以某种方式重塑,但是即使完成这个简单的任务我还是卡住了,
dat$bird_number<- cbind(dat$bird, as.numeric(levels(dat$Number))[dat$Number])
我猜是因为当我制作数据集时,所有列都是因子,我需要第二个列是数字...我无法转换它,甚至不按照以下 link 中给出的说明进行操作。
How to convert a factor to an integer\numeric without a loss of information?
如何让它变成数字?然后如何重塑我的数据集?
我尝试了几种策略,现在寻求你的帮助,
期待学习!
玩得开心
这实际上是一个简单的 "long-to-wide" 转换。这是基础 R 中的方法:
reshape(dat, direction = "wide", idvar = c("couple", "day", "calltype"),
timevar = "bird")
## couple day calltype Number.m1 Number.f1
## 1 E d1 tot_s 9 6
## 3 E d3 tot_s 8 2
## 5 E d5 tot_s 4 9
## 7 E d7 tot_s 2 1
## 9 F d1 tot_s 1 3
## 11 F d3 tot_s 9 10
## 13 F d5 tot_s 3 9
## 15 F d7 tot_s 2 6
或者,使用 "data.table" 包中的 dcast
:
library(data.table)
dcast(as.data.table(dat), ... ~ bird, value.var = "Number")
## couple day calltype f1 m1
## 1: E d1 tot_s 6 9
## 2: E d3 tot_s 2 8
## 3: E d5 tot_s 9 4
## 4: E d7 tot_s 1 2
## 5: F d1 tot_s 3 1
## 6: F d3 tot_s 10 9
## 7: F d5 tot_s 9 3
## 8: F d7 tot_s 6 2
或者,使用 "tidyr" 中的 spread
:
spread(dat, bird, Number)
## couple day calltype f1 m1
## 1 E d1 tot_s 6 9
## 2 E d3 tot_s 2 8
## 3 E d5 tot_s 9 4
## 4 E d7 tot_s 1 2
## 5 F d1 tot_s 3 1
## 6 F d3 tot_s 10 9
## 7 F d5 tot_s 9 3
## 8 F d7 tot_s 6 2
我在论坛的任何地方都找不到解决我的问题的方法,所以我认为不是重复的。
我有一个数据集如下:
> couple bird day calltype Number
1 E m1 d1 tot_s 5
2 E f1 d1 tot_s 2
3 E m1 d3 tot_s 6
4 E f1 d3 tot_s 5
5 E m1 d5 tot_s 3
6 E f1 d5 tot_s 6
7 E m1 d7 tot_s 1
8 E f1 d7 tot_s 7
9 F m1 d1 tot_s 9
10 F f1 d1 tot_s 5
11 F m1 d3 tot_s 10
12 F f1 d3 tot_s 8
13 F m1 d5 tot_s 6
14 F f1 d5 tot_s 7
15 F m1 d7 tot_s 4
16 F f1 d7 tot_s 5
我想将其转换为:
couple1 day1 calltype1 number_m1 number_f1
1 E d1 tot_s 1 2
2 E d3 tot_s 5 7
3 E d5 tot_s 4 7
4 E d7 tot_s 4 4
5 F d1 tot_s 3 6
6 F d3 tot_s 3 2
7 F d5 tot_s 8 8
8 F d7 tot_s 2 2
第一个数据集的可重现示例:
couple<- rep(c("E","F"), each=8)
bird<- rep(c("m1","f1"), 4)
day <- rep(rep(c("d1","d3", "d5", "d7"), each=2),2)
calltype <- rep("tot_s", 16)
Number <- as.numeric(sample(1:10, replace = TRUE, 16))
dat<- data.frame(cbind(couple, bird, day, calltype, Number))
还有第二个:
couple1<- rep(c("E","F"), each=4)
day1 <- rep(c("d1","d3", "d5", "d7"),2)
calltype1 <- rep("tot_s", 8)
number_m1 <- c(dat$Number[1], dat$Number[3], dat$Number[5], dat$Number[7], dat$Number[9], dat$Number[11], dat$Number[13], dat$Number[15] )
number_f1 <- c(dat$Number[2], dat$Number[4], dat$Number[6], dat$Number[8], dat$Number[10], dat$Number[12], dat$Number[14], dat$Number[16] )
dat1<- data.frame(cbind(couple1, day1, calltype1, number_m1, number_f1))
它可行的策略是合并 2 列 然后以某种方式重塑,但是即使完成这个简单的任务我还是卡住了,
dat$bird_number<- cbind(dat$bird, as.numeric(levels(dat$Number))[dat$Number])
我猜是因为当我制作数据集时,所有列都是因子,我需要第二个列是数字...我无法转换它,甚至不按照以下 link 中给出的说明进行操作。
How to convert a factor to an integer\numeric without a loss of information?
如何让它变成数字?然后如何重塑我的数据集?
我尝试了几种策略,现在寻求你的帮助, 期待学习!
玩得开心
这实际上是一个简单的 "long-to-wide" 转换。这是基础 R 中的方法:
reshape(dat, direction = "wide", idvar = c("couple", "day", "calltype"),
timevar = "bird")
## couple day calltype Number.m1 Number.f1
## 1 E d1 tot_s 9 6
## 3 E d3 tot_s 8 2
## 5 E d5 tot_s 4 9
## 7 E d7 tot_s 2 1
## 9 F d1 tot_s 1 3
## 11 F d3 tot_s 9 10
## 13 F d5 tot_s 3 9
## 15 F d7 tot_s 2 6
或者,使用 "data.table" 包中的 dcast
:
library(data.table)
dcast(as.data.table(dat), ... ~ bird, value.var = "Number")
## couple day calltype f1 m1
## 1: E d1 tot_s 6 9
## 2: E d3 tot_s 2 8
## 3: E d5 tot_s 9 4
## 4: E d7 tot_s 1 2
## 5: F d1 tot_s 3 1
## 6: F d3 tot_s 10 9
## 7: F d5 tot_s 9 3
## 8: F d7 tot_s 6 2
或者,使用 "tidyr" 中的 spread
:
spread(dat, bird, Number)
## couple day calltype f1 m1
## 1 E d1 tot_s 6 9
## 2 E d3 tot_s 2 8
## 3 E d5 tot_s 9 4
## 4 E d7 tot_s 1 2
## 5 F d1 tot_s 3 1
## 6 F d3 tot_s 10 9
## 7 F d5 tot_s 9 3
## 8 F d7 tot_s 6 2