如何将与条件匹配的值存储在 R 数据框中的单独列中?
How to store the values that match the condition in a separate column in the dataframe in R?
我有这样的数据集:
ISIN Variable Value
182 Sales2008 276
182 Sales2009 800
182 Sales2010 900
182 Sales2011 273
182 Sales2012 276
182 Sales2013 123
182 Sales2014 345
182 Sales2015 444
182 Sales2016 666
182 Sales2017 777
182 Sales2018 999
182 Sales2019 235
182 Salesf2008 276
182 Salesf2009 800
182 Salesf2010 900
182 Salesf2011 273
182 Salesf2012 276
182 Salesf2013 123
182 Salesf2014 345
182 Salesf2015 444
182 Salesf2016 666
182 Salesf2017 777
182 Salesf2018 999
182 Salesf2019 235
182 ROA2008 333
182 ROA2009 333
182 ROA2010 333
182 ROA2011 333
182 ROA2012 333
182 ROA2013 333
182 ROA2014 333
182 ROA2015 333
182 ROA2016 333
182 ROA2017 333
182 ROA2018 333
182 ROA2019 333
您对如何创建一个新的 df 有什么建议吗?其中 Sales2008
到 Sales2019
的值将存储在一列中?此外,Salesf2008
到 Salesf2019
的值将存储在下一列中,而 ROA2008
到 ROA2019
的值将存储在下一列中?
提前致谢!
很难说没有你预期的输出,但听起来你想要这个。这使用 extract()
通过提取 1) 字母和 2) 4 位数字来制作两列,并使用 pivot_wider()
使用新列从长到宽:“Col”和您的“值”列。希望对您有所帮助!!
library(tidyr)
library(dplyr) # for %>%
df1 %>%
extract(Variable, c("Col", "Year"), "([A-Za-z]+)(\d{4})", convert = TRUE) %>%
pivot_wider(names_from = Col, values_from = Value)
# A tibble: 12 x 5
ISIN Year Sales Salesf ROA
<int> <int> <int> <int> <int>
1 182 2008 276 276 333
2 182 2009 800 800 333
3 182 2010 900 900 333
4 182 2011 273 273 333
5 182 2012 276 276 333
6 182 2013 123 123 333
7 182 2014 345 345 333
8 182 2015 444 444 333
9 182 2016 666 666 333
10 182 2017 777 777 333
11 182 2018 999 999 333
12 182 2019 235 235 333
数据:
df1 <- read.table(header = TRUE, text = "ISIN Variable Value
182 Sales2008 276
182 Sales2009 800
182 Sales2010 900
182 Sales2011 273
182 Sales2012 276
182 Sales2013 123
182 Sales2014 345
182 Sales2015 444
182 Sales2016 666
182 Sales2017 777
182 Sales2018 999
182 Sales2019 235
182 Salesf2008 276
182 Salesf2009 800
182 Salesf2010 900
182 Salesf2011 273
182 Salesf2012 276
182 Salesf2013 123
182 Salesf2014 345
182 Salesf2015 444
182 Salesf2016 666
182 Salesf2017 777
182 Salesf2018 999
182 Salesf2019 235
182 ROA2008 333
182 ROA2009 333
182 ROA2010 333
182 ROA2011 333
182 ROA2012 333
182 ROA2013 333
182 ROA2014 333
182 ROA2015 333
182 ROA2016 333
182 ROA2017 333
182 ROA2018 333
182 ROA2019 333")
我有这样的数据集:
ISIN Variable Value
182 Sales2008 276
182 Sales2009 800
182 Sales2010 900
182 Sales2011 273
182 Sales2012 276
182 Sales2013 123
182 Sales2014 345
182 Sales2015 444
182 Sales2016 666
182 Sales2017 777
182 Sales2018 999
182 Sales2019 235
182 Salesf2008 276
182 Salesf2009 800
182 Salesf2010 900
182 Salesf2011 273
182 Salesf2012 276
182 Salesf2013 123
182 Salesf2014 345
182 Salesf2015 444
182 Salesf2016 666
182 Salesf2017 777
182 Salesf2018 999
182 Salesf2019 235
182 ROA2008 333
182 ROA2009 333
182 ROA2010 333
182 ROA2011 333
182 ROA2012 333
182 ROA2013 333
182 ROA2014 333
182 ROA2015 333
182 ROA2016 333
182 ROA2017 333
182 ROA2018 333
182 ROA2019 333
您对如何创建一个新的 df 有什么建议吗?其中 Sales2008
到 Sales2019
的值将存储在一列中?此外,Salesf2008
到 Salesf2019
的值将存储在下一列中,而 ROA2008
到 ROA2019
的值将存储在下一列中?
提前致谢!
很难说没有你预期的输出,但听起来你想要这个。这使用 extract()
通过提取 1) 字母和 2) 4 位数字来制作两列,并使用 pivot_wider()
使用新列从长到宽:“Col”和您的“值”列。希望对您有所帮助!!
library(tidyr)
library(dplyr) # for %>%
df1 %>%
extract(Variable, c("Col", "Year"), "([A-Za-z]+)(\d{4})", convert = TRUE) %>%
pivot_wider(names_from = Col, values_from = Value)
# A tibble: 12 x 5
ISIN Year Sales Salesf ROA
<int> <int> <int> <int> <int>
1 182 2008 276 276 333
2 182 2009 800 800 333
3 182 2010 900 900 333
4 182 2011 273 273 333
5 182 2012 276 276 333
6 182 2013 123 123 333
7 182 2014 345 345 333
8 182 2015 444 444 333
9 182 2016 666 666 333
10 182 2017 777 777 333
11 182 2018 999 999 333
12 182 2019 235 235 333
数据:
df1 <- read.table(header = TRUE, text = "ISIN Variable Value
182 Sales2008 276
182 Sales2009 800
182 Sales2010 900
182 Sales2011 273
182 Sales2012 276
182 Sales2013 123
182 Sales2014 345
182 Sales2015 444
182 Sales2016 666
182 Sales2017 777
182 Sales2018 999
182 Sales2019 235
182 Salesf2008 276
182 Salesf2009 800
182 Salesf2010 900
182 Salesf2011 273
182 Salesf2012 276
182 Salesf2013 123
182 Salesf2014 345
182 Salesf2015 444
182 Salesf2016 666
182 Salesf2017 777
182 Salesf2018 999
182 Salesf2019 235
182 ROA2008 333
182 ROA2009 333
182 ROA2010 333
182 ROA2011 333
182 ROA2012 333
182 ROA2013 333
182 ROA2014 333
182 ROA2015 333
182 ROA2016 333
182 ROA2017 333
182 ROA2018 333
182 ROA2019 333")