按组拆分列

Ama*_*nda 5 split r dataframe

我有一些看起来有点像这样的数据:

test.frame <- read.table(text = "name   amounts   
                                JEAN  318.5,45
                             GREGORY 1518.5,67,8
                              WALTER  518.5
                               LARRY  518.5,55,1
                               HARRY  318.5,32
                         ",header = TRUE,sep = "")
Run Code Online (Sandbox Code Playgroud)

我希望它看起来更像这样......

name   amount
JEAN  318.5
JEAN 45
GREGORY 1518.5
GREGORY 67
GREGORY 8
WALTER  518.5
LARRY  518.5
LARRY  55
LARRY  1
HARRY  318.5
HARRY  32
Run Code Online (Sandbox Code Playgroud)

看起来应该有一种直截了当的方式来打破"金额"栏目,但我没想出来.很高兴为这个特定命令采取"RTFM页面"的答案.我正在寻找什么命令?

raw*_*awr 6

(test.frame <- read.table(text = "name   amounts   
                                JEAN  318.5,45
                             GREGORY 1518.5,67,8
                              WALTER  518.5
                               LARRY  518.5,55,1
                               HARRY  318.5,32
                         ",header = TRUE,sep = ""))


#      name     amounts
# 1    JEAN    318.5,45
# 2 GREGORY 1518.5,67,8
# 3  WALTER       518.5
# 4   LARRY  518.5,55,1
# 5   HARRY    318.5,32

tmp <- setNames(strsplit(as.character(test.frame$amounts), 
                split = ','), test.frame$name)

data.frame(name = rep(names(tmp), sapply(tmp, length)), 
           amounts = unlist(tmp), row.names = NULL)

#       name amounts
# 1     JEAN   318.5
# 2     JEAN      45
# 3  GREGORY  1518.5
# 4  GREGORY      67
# 5  GREGORY       8
# 6   WALTER   518.5
# 7    LARRY   518.5
# 8    LARRY      55
# 9    LARRY       1
# 10   HARRY   318.5
# 11   HARRY      32
Run Code Online (Sandbox Code Playgroud)


Dav*_*urg 6

最快的方式(可能)将是 data.table

library(data.table)
setDT(test.frame)[, lapply(.SD, function(x) unlist(strsplit(as.character(x), ','))),
                  .SDcols = "amounts", by = name]

 ##       name amounts
 ## 1:    JEAN   318.5
 ## 2:    JEAN      45
 ## 3: GREGORY  1518.5
 ## 4: GREGORY      67
 ## 5: GREGORY       8
 ## 6:  WALTER   518.5
 ## 7:   LARRY   518.5
 ## 8:   LARRY      55
 ## 9:   LARRY       1
 ## 10:  HARRY   318.5
 ## 11:  HARRY      32
Run Code Online (Sandbox Code Playgroud)