我试图根据单列数据的值更改数据框的格式,以表示另一列的重复序列。我的数据集由一个文件名,观察数,日期和物种识别组成。使用数据集的状态(请参见下文),我仅设法绘制n> 0的值,但是我想保留零以对比例有一个总体了解而不会丢失观测值。
我已经尝试过tidyr :: spread函数,但是我不想基于该单个值创建新列。我希望根据第一个(n)的值重复其他列(例如file.name,Date,ID)。 tidyr :: melt似乎也对我没有帮助...
这是一个例子:
call_obs <- data.frame("file.name" = c("pa0095au_001_180315_192129.wav", "pa0095au_002_180315_193134.wav", "pa0095au_003_180315_194133.wav", "pa0097au_002_180316_004647.wav", "pa0097au_003_180316_005646.wav"), "ID" = c("HW","None", "None", "HW", "HW"), "n" = c(1,0,0,3,2),"Date" = c('2018-03-15','2018-03-15','2018-03-15', '2018-03-16', '2018-03-16'))
我想要类似
data.frame("file.name" = c("pa0095au_001_180315_192129.wav", "pa0095au_002_180315_193134.wav", pa0095au_003_180315_194133.wav", "pa0097au_002_180316_004647.wav", "pa0097au_002_180316_004647.wav", "pa0097au_002_180316_004647.wav", "pa0097au_003_180316_005646.wav", "pa0097au_003_180316_005646.wav"), "ID" = c("HW","None", "None", "HW", "HW", "HW", "HW", "HW"), "n" = c(1,0,0,1,1,1,1,1), "Date" = c('2018-03-15','2018-03-15','2018-03-15', '2018-03-16', '2018-03-16', '2018-03-16', '2018-03-16', '2018-03-16'))
日期为日期,文件名为字符,ID为因子,n为数字
任何帮助都会很棒。
答案 0 :(得分:0)
这是在基数R中在行上使用rep
的一种方法:
call_obs <- call_obs[rep(seq(nrow(call_obs)), ifelse(call_obs$n == 0, 1, call_obs$n)),]
call_obs$n <- as.numeric(call_obs$n > 0)
答案 1 :(得分:0)
使用tidyr
和dplyr
,您可以执行以下操作:
library(tidyr)
library(dplyr)
call_obs %>%
uncount(., if_else(n == 0, n +1, n)) %>%
mutate(n = if_else(n > 0, 1, 0))
# file.name ID n Date
#1 pa0095au_001_180315_192129.wav HW 1 2018-03-15
#2 pa0095au_002_180315_193134.wav None 0 2018-03-15
#3 pa0095au_003_180315_194133.wav None 0 2018-03-15
#4 pa0097au_002_180316_004647.wav HW 1 2018-03-16
#5 pa0097au_002_180316_004647.wav HW 1 2018-03-16
#6 pa0097au_002_180316_004647.wav HW 1 2018-03-16
#7 pa0097au_003_180316_005646.wav HW 1 2018-03-16
#8 pa0097au_003_180316_005646.wav HW 1 2018-03-16