如何将dataframe从单个列值重新构造为重复的列行

如何将dataframe从单个列值重新构造为重复的列行,r,R,我试图根据一列数据的值更改数据帧的格式,以表示另一列的重复序列。我的数据集包括文件名、观察次数、日期和物种识别。对于数据集的现状(见下文),我只绘制了n>0的值,但我希望保留0,以便在不丢失观察值的情况下,对比例进行概述 我已经尝试了tidyr::spread函数,但我不想基于单个列的值创建新列。我希望根据第一列(n)的值重复其他列(例如file.name、Date、ID)。tidyr::melt似乎也不适合我 下面是一个例子: call_obs <- data.frame("file.n

我试图根据一列数据的值更改数据帧的格式,以表示另一列的重复序列。我的数据集包括文件名、观察次数、日期和物种识别。对于数据集的现状(见下文),我只绘制了n>0的值,但我希望保留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')) 
日期作为日期,file.name作为字符,ID作为因子,n作为数字


任何帮助都会很好。

在base 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)

call\u obs在基本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)

使用
tidyr
dplyr调用\u obs您可以执行以下操作:

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

使用
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

类似于
tidyr::uncount(调用obs,ifelse(n==0,n+1,n))
类似于
tidyr::uncount(调用obs,ifelse(n==0,n+1,n))