【问题标题】:How to restructure dataframe from single column value into repeated column rows如何将数据框从单列值重组为重复的列行
【发布时间】:2019-11-04 15:06:20
【问题描述】:

我正在尝试根据单列数据的值更改我的数据框的格式,以表示另一列的重复序列。我的数据集由文件名、观察次数、日期和物种标识组成。使用数据集(见下文),我只设法绘制 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'))

日期为日期,file.name 为字符,ID 为因子,n 为数字

任何帮助都会很棒。

【问题讨论】:

  • 类似tidyr::uncount(call_obs, ifelse(n == 0, n + 1, n))

标签: r


【解决方案1】:

使用tidyrdplyr 你可以做到:

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

【讨论】:

    【解决方案2】:

    这是在基本 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)
    

    【讨论】:

      猜你喜欢
      • 2019-12-28
      • 1970-01-01
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      • 2016-12-11
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      相关资源
      最近更新 更多