合并来自 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