[英]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
您也可以嘗試tidyr
的separate
:
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.