R - 使用str_split和unlist创建两列

时间:2014-06-30 18:14:33

标签: r strsplit

我有一个数据集,其日期和利率在同一列中。我需要将这两个数字拆分为两个单独的列,但是当我使用以下代码时:

 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

由于

7 个答案:

答案 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))