我想根据字符串中的最后一个条目向data.frame
添加一个新列,以便我可以进行回归分析。特别是,我试图从Fertiliser
变量中提取信息,该变量包含由连字符分隔的三种不同类型肥料的数量的信息。例如:0-0-0
或30-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
替换,100
,300
,900
,2700
答案 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))