我有一个数据集,其日期和利率在同一列中。我需要将这两个数字拆分为两个单独的列,但是当我使用以下代码时:
Split <- str_split(df$Dates, "[ ]", n = 2)
Dates <- unlist(Split)[1]
Rates <- unlist(Split)[2]
它只返回第一个&#34;值&#34;每个元素,即&#34; 1971-04-01&#34;对于日期和&#34; 7.43&#34;对于费率。我需要它返回字符串拆分部分的所有值,并且字符串拆分的第二部分返回相同的值
以下是数据集的一部分,总行数= 518.
1971-04-01 7.31
1971-05-01 7.43
1971-06-01 7.53
1971-07-01 7.60
1971-08-01 7.70
1971-09-01 7.69
1971-10-01 7.63
1971-11-01 7.55
1971-12-01 7.48
1972-01-01 7.44
由于
答案 0 :(得分:10)
可以做
Split <- strsplit(as.character(df$Dates), " ", fixed = TRUE)
Dates <- sapply(Split, "[", 1)
Rates <- sapply(Split, "[", 2)
答案 1 :(得分:3)
您可以使用reshape2::colsplit
library(reshape2)
colsplit(df$Dates, ' ', names = c('Dates','Rates'))
# Dates Rates
# 1 1971-04-01 7.31
# 2 1971-05-01 7.43
# 3 1971-06-01 7.53
# 4 1971-07-01 7.60
# 5 1971-08-01 7.70
# 6 1971-09-01 7.69
# 7 1971-10-01 7.63
# 8 1971-11-01 7.55
# 9 1971-12-01 7.48
# 10 1972-01-01 7.44
答案 2 :(得分:2)
使用@ user2583119的数据(请发布包含数据集的最小可重现代码):
library(qdap)
colsplit2df(data.frame(Split), sep = " ")
## X1 X2
## 1 1971-06-01 7.53
## 2 1971-05-01 7.43
## 3 1971-06-01 7.53
答案 3 :(得分:2)
也许我有偏见,但我建议my cSplit
function解决这个问题。
首先,我假设我们从以下(单列)data.frame
开始(其中&#34; date&#34;值和&#34; rate&之间有多个空格#34;价值)。
df <- data.frame(
Date = c("1971-04-01 7.31", "1971-05-01 7.43", "1971-06-01 7.53",
"1971-07-01 7.60", "1971-08-01 7.70", "1971-09-01 7.69",
"1971-10-01 7.63", "1971-11-01 7.55", "1971-12-01 7.48",
"1972-01-01 7.44"))
接下来,get the cSplit
function from my GitHub Gist,然后使用它。您可以拆分正则表达式(此处为多个空格)。
cSplit(df, "Date", "\\s+", fixed = FALSE)
# Date_1 Date_2
# 1: 1971-04-01 7.31
# 2: 1971-05-01 7.43
# 3: 1971-06-01 7.53
# 4: 1971-07-01 7.60
# 5: 1971-08-01 7.70
# 6: 1971-09-01 7.69
# 7: 1971-10-01 7.63
# 8: 1971-11-01 7.55
# 9: 1971-12-01 7.48
# 10: 1972-01-01 7.44
由于该功能会将data.frame
转换为data.table
,因此您可以访问setnames
,这样您就可以重新命名列。
setnames(cSplit(df, "Date", "\\s+", fixed = FALSE), c("Dates", "Rates"))[]
# Dates Rates
# 1: 1971-04-01 7.31
# 2: 1971-05-01 7.43
# 3: 1971-06-01 7.53
# 4: 1971-07-01 7.60
# 5: 1971-08-01 7.70
# 6: 1971-09-01 7.69
# 7: 1971-10-01 7.63
# 8: 1971-11-01 7.55
# 9: 1971-12-01 7.48
# 10: 1972-01-01 7.44
答案 4 :(得分:1)
此外:
Split <- c("1971-06-01 7.53", "1971-05-01 7.43", "1971-06-01 7.53")
您的代码仅选择第一个观察结果。
Str <- unlist(str_split(Split, "[ ]", n=2))
Str[1]
#[1] "1971-06-01"
如果查看unlist(..)的output
,则日期后跟值。因此,您可以使用逻辑索引。
Str[c(T,F)]
#[1] "1971-06-01" "1971-05-01" "1971-06-01"
as.numeric(Str[c(F,T)])
#[1] 7.53 7.43 7.53
您可以使用Split
read.table
转换为数据框的两列
read.table(text=Split, header=F, sep="",stringsAsFactors=F)
# V1 V2
# 1 1971-06-01 7.53
# 2 1971-05-01 7.43
# 3 1971-06-01 7.53
答案 5 :(得分:0)
试试这个:
Split <- c("1971-06-01 7.53", "1971-05-01 7.43", "1971-06-01 7.53")
df <- unlist(str_split(string = Split, pattern = "\\s"))
df
答案 6 :(得分:0)
df <- data.frame(
Date = c("1971-04-01 7.31", "1971-05-01 7.43", "1971-06-01 7.53",
"1971-07-01 7.60", "1971-08-01 7.70", "1971-09-01 7.69",
"1971-10-01 7.63", "1971-11-01 7.55", "1971-12-01 7.48",
"1972-01-01 7.44"))
do.call(rbind, strsplit(as.character(df$Date), split = '\\s+', fixed = FALSE))