繁体   English   中英

拆分 R 数据帧内的每个字符串

[英]Split each string inside an R data frame

首先我必须 state 我绝对是 R 的菜鸟。 我只查看了教程代码。

我需要改造我当前的 state:

timeseries <- as.data.frame(
  unlist(
    strsplit(
      rawToChar(
        output$stdout
      ),
      "\n"
    )
  )
)
                                   V1
1  DEV+M0001000 1514779200 1571637600
2  DEV+M0001CAL 1567108800 1567195200
3  DEV+M0003000 1514779200 1571637600
4  DEV+M0003CAL 1567105200 1567108800
5  DEV+M0004000 1514779200 1571637600
6  DEV+M0004CAL 1567108800 1567195200

…进入二维数据框,如:

             V1         V2         V3
1  DEV+M0001000 1514779200 1571637600
2  DEV+M0001CAL 1567108800 1567195200
3  DEV+M0003000 1514779200 1571637600
4  DEV+M0003CAL 1567105200 1567108800
5  DEV+M0004000 1514779200 1571637600
6  DEV+M0004CAL 1567108800 1567195200

有什么建议吗? 或者链接到同样的问题?

您可以拆分字符串,然后使用基础 R 将 output 组合成一个数据框:

as.data.frame(do.call(rbind, strsplit(df$V1, " ")))

#### OUTPUT ####
            V1         V2         V3
1 DEV+M0001000 1514779200 1571637600
2 DEV+M0001CAL 1567108800 1567195200
3 DEV+M0003000 1514779200 1571637600
4 DEV+M0003CAL 1567105200 1567108800
5 DEV+M0004000 1514779200 1571637600
6 DEV+M0004CAL 1567108800 1567195200

您也可以尝试tidyrseparate

library(tidyr)
separate(df, V1, c("V1", "V2", "V3"), " ")

#### OUTPUT ####
            V1         V2         V3
1 DEV+M0001000 1514779200 1571637600
2 DEV+M0001CAL 1567108800 1567195200
3 DEV+M0003000 1514779200 1571637600
4 DEV+M0003CAL 1567105200 1567108800
5 DEV+M0004000 1514779200 1571637600
6 DEV+M0004CAL 1567108800 1567195200

我们可以尝试在此处使用sub作为基本 R 选项:

df$V2 <- sub("^\\S+ (\\S+) \\S+", "\\1", df$V1)
df$V3 <- sub("^\\S+ \\S+ ", "", df$V1)
df$V1 <- sub(" \\S+ \\S+$", "", df$V1)
df
            V1         V2         V3
1 DEV+M0001000 1514779200 1571637600
2 DEV+M0001CAL 1567108800 1567195200

数据:

df <- data.frame(V1=c("DEV+M0001000 1514779200 1571637600",
                      "DEV+M0001CAL 1567108800 1567195200"), stringsAsFactors=FALSE)
df
                                  V1
1 DEV+M0001000 1514779200 1571637600
2 DEV+M0001CAL 1567108800 1567195200

数据:

df <- data.frame(V1=c("DEV+M0001000 1514779200 1571637600",
                              "DEV+M0001CAL 1567108800 1567195200"), stringsAsFactors=FALSE)


df$V2 <- "whatever"

df$V3 <- "how you going"

将字符串拆分为新列(无论 df$V1 中的元素数量以及包含 df 的向量数量如何):

split_df <- cbind(df[, colnames(df) != "V1", drop = FALSE],

                  data.frame(do.call("rbind", strsplit(df$V1, "\\s+"))))

colnames(split_df) <- c(names(df[, names(df) != "V1"]),

                        as.character(c(
                          gsub(".*[$]", "", deparse(substitute(df$V1))),

                          paste0(rep("V", length(grep(
                            "\\s+", df$V1
                          ))),

                          c(ncol(df) + 1):(length(grep(
                            "\\s+", df$V1
                          )) + ncol(df)))
                        )))
names(split_df)

可以先写成3列子串的矩阵,再写入数据框。

as.data.frame(matrix(sapply(timeseries,function(v) unlist(strsplit(v,split = " "))), ncol=3, byrow = TRUE))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM