通过分隔现有列中的字符串,将新列添加到数据框中

时间:2016-04-17 22:26:47

标签: r grep pattern-matching

我想根据字符串中的最后一个条目向data.frame添加一个新列,以便我可以进行回归分析。特别是,我试图从Fertiliser变量中提取信息,该变量包含由连字符分隔的三种不同类型肥料的数量的信息。例如:0-0-030-10-2700是可行的。字符串的最后一部分是我需要捕获的部分,例如x-y-z我需要z

我尝试过,但无法在此处How to create new column in dataframe based on partial string matching other column in R调整答案。

更完整的数据示例:

    Fertiliser millet_biomass millet_yield
 1:      0-0-0       2659.608     710.6942
 2:    0-0-100       2701.044     718.1154
 3:   0-0-2700       3415.879     804.0360
 4:    0-0-300       2781.639     730.5943
 5:    0-0-900       2997.173     760.0136
 6:     12-4-0       3703.255     772.1719
 7:   12-4-100       3720.247     773.1759
 8:  12-4-2700       3950.189     788.6133
 9:   12-4-300       3751.400     775.1368
10:   12-4-900       3826.693     780.2623
11:    30-10-0       4180.323     798.2134
12:  30-10-100       4184.229     798.4918
13: 30-10-2700       4217.044     800.9312
14:  30-10-300       4187.014     798.6570
15:  30-10-900       4194.873     799.2085
16:      6-2-0       3296.274     765.8496
17:    6-2-100       3326.844     767.6693
18:   6-2-2700       3772.058     785.4535
19:    6-2-300       3381.152     760.7330
20:    6-2-900       3517.515     768.3018
21:    90-30-0       4542.924     831.2832
22:  90-30-100       4543.036     831.3983
23: 90-30-2700       4545.037     831.3227
24:  90-30-300       4543.240     831.3921
25:  90-30-900       4543.733     831.3727

因此,有五种模式-0$-100$-300$-900$2700$,需要由0替换,1003009002700

3 个答案:

答案 0 :(得分:3)

这是你想做的吗?我们来看一段数据:

Fertiliser <- c("0-0-0", "0-0-100", "0-0-2700", "0-0-300")
millet_yield <- c(710, 718, 804, 730)
df <- data.frame(Fertiliser, millet_yield)

df看起来像这样:

   Fertiliser millet_yield
#1      0-0-0          710
#2    0-0-100          718
#3   0-0-2700          804
#4    0-0-300          730

使用separate()包中的tidyr

library(tidyr)
df %>% separate(Fertiliser, into=(c("F1", "F2", "Manure")), sep="-", convert=T)

   F1 F2 Manure millet_yield
#1  0  0      0          710
#2  0  0    100          718
#3  0  0   2700          804
#4  0  0    300          730

convert=T确保字符串变为数字。现在,您可以对数据进行回归。

答案 1 :(得分:0)

我们可以从stri_extract_last中提取stringi的最后一个数字。由于数据集已经是data.table,因此可以使用data.table方法为新列指定(:=)。

library(data.table)
library(stringi)
setDT(df1)[, Manure := as.numeric(stri_extract_last_regex(Fertiliser, "\\d+"))]
head(df1)
#   Fertiliser millet_biomass millet_yield Manure
#1:      0-0-0       2659.608     710.6942      0
#2:    0-0-100       2701.044     718.1154    100
#3:   0-0-2700       3415.879     804.0360   2700
#4:    0-0-300       2781.639     730.5943    300
#5:    0-0-900       2997.173     760.0136    900
#6:     12-4-0       3703.255     772.1719      0

base R选项

df1$Manure <- as.numeric(sub(".*-", "", df1$Fertiliser))

答案 2 :(得分:0)

您可以使用sub轻松完成此操作,删除所有内容,包括最后一个连字符:

transform(x, Fertiliser = sub('.*-', '', Fertiliser))
##     Fertiliser millet_biomass millet_yield
## 1:           0       2659.608     710.6942
## 2:         100       2701.044     718.1154
## 3:        2700       3415.879     804.0360
## 4:         300       2781.639     730.5943

...

在这里,.*是贪婪的,因此在匹配最终的-字符之前,它会尽可能匹配。

您也可以重命名结果列,而不是替换Fertiliser

 transform(x, Quantity = sub('.*-', '', Fertiliser))