【问题标题】:Expand dataframe based on new column根据新列扩展数据框
【发布时间】:2017-06-13 13:57:03
【问题描述】:

我有以下数据框:

df <- data.frame(
     month=c("July", "August", "August"),
     day=c(31, 1, 2),
     time=c(12, 12, 12))

   month day time
1   July  31   12
2 August   1   12
3 August   2   12

我有一个时间文本文件(十进制格式),我想用文本文件中的所有时间替换“时间”列。文本文件中有多个天,每个天有 300 多条记录。

7-31-2016 #the days are all concatenated together, this line represents the beginning of one day (July 31)
13.12344
13.66445
13.76892
...
8-1-2016 #here is another day (August 1)
14.50333
14.52000
14.53639
...

但是,文本文件比当前数据框长得多——它有 393 条记录。所以我希望生成的数据框看起来像这样:

    month   day       time
5    July    31   13.12344
6    July    31   13.66445
7    July    31   13.76892
.....
393 August    1   14.50333
394 August    1   14.52000
394 August    1   14.53639

基本上我只需要能够扩展我当前的数据框以匹配新文件中的记录数,同时保持同一天。希望这是有道理的。

【问题讨论】:

  • 你的文本文件结构如何?
  • 请提供从文本文件中读取的数据框或列表。
  • @NicoCoallier 文本文件结构与我在帖子中列出的完全一样。它基本上只是一个串联在一起的时间列表。日期表示新的一天(例如 7 月 31 日、8 月 1 日等)。
  • @OmaymaS 我不确定你想要什么?文本文件和现有数据框都非常大,所以我只是提供了一个示例。
  • 我也有点困惑是什么让你挂了。这似乎您只想将两个数据框格式化为具有月和日列并将它们合并到这些列上。您在格式化第二个数据框时遇到问题吗?

标签: r dataframe


【解决方案1】:
# Create txt data
txt <- data.frame(x = c('7-31-2016', '13.12344', '13.66445', '13.76892', '8-1-2016', '14.50333', '14.52000', '14.53639'))
# Load Your data 
df <- data.frame(
  month=c("July", "August", "August"),
  day=c(31, 1, 2),
  time=c(12, 12, 12))

# Need a year to join dates
df$year <- 2016

# Create date column
df$date <- as.Date(paste0(df$month, "/", df$day, "/", df$year), format = "%B/%d/%Y")

# Find values with dashes, then replaces with /
txt$dash <- grepl('-', txt$x)
txt$x <- gsub("-", "/", txt$x)

# Adds new columns
library(dplyr)
txt <- mutate(txt, date = ifelse(dash==TRUE, as.Date(x, format = "%m/%d/%Y"), NA))
txt <- mutate(txt, time = ifelse(dash==FALSE, as.numeric(x), NA))

# Fill down values
library(zoo)
txt$date <- na.locf(txt$date)

# Removes NA and keeps necessary columns
txt <- txt[!is.na(txt$time),]
txt <- txt[c("date", "time")]

# Merge
output <- merge(df, txt, by = "date")

【讨论】:

    【解决方案2】:

    因此,您想将只有 3 行的现有 data.frame df 与有很多行的 new_text 合并。使用:

    merge(df, new_text, all.y = T) #all.y will interpolate new rows for the ones that don't match
    

    欲了解更多信息,请参阅?merge

    【讨论】:

      【解决方案3】:

      将txt文件变成可合并的dataframe

       df$V2=as.numeric(df$V1)
       Temp=is.na(df$V2)
       df$V2=NA
       df$V2[Temp]=df$V1[Temp]
       df$V2=na.locf(df$V2)
       df=df[!Temp,]
      
              V1        V2
      2 13.12344 7/31/2016
      3 13.66445 7/31/2016
      4 13.76892 7/31/2016
      6 14.50333  8/1/2016
      7    14.52  8/1/2016
      8 14.53639  8/1/2016
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-30
        • 2020-12-16
        • 2021-05-12
        • 2021-03-15
        • 2019-06-18
        • 2022-06-11
        相关资源
        最近更新 更多