预先感谢您的帮助。
我在R中有一个数据框,其中的每一行都有一个Year列(year = 2008-2017),每个列的标题都是这样(Price_2008,Cause_2008,Price_2009,Cause_2009等)。
这个想法是在数据框中创建另外两列,标题为“价格”和“原因”,然后查看“年份”以指向右边的列以获取数据。 (即:如果year = 2018,请选择Price_2018和Cause_2018)。
任何做到这一点的想法都将受到赞赏!我对R非常陌生,无法在SAS中做到这一点...
谢谢!
添加的代码:
for (i in c(2008:2017)){
for (j in 1:nrow(abc)){
if (abc$year[j] == i) {(abc$Price[j]<-c(abc$Price_2008:abc$Price_2017)[j])
& (abc$Cause[j]<-c(abc$Cause_2008:abc$Cause_2017)[j])
}}}
答案 0 :(得分:1)
您可以编写函数来获取价格和原因值,并将其应用于每行。例如
year <- ceiling(runif(10,2007,2010))
price_2008 <- rnorm(10,10,3)
price_2009 <- rnorm(10,10,3)
price_2010 <- rnorm(10,10,3)
price_2011 <- rnorm(10,10,3)
cause_2008 <- rnorm(10,10,3)
cause_2009 <- rnorm(10,10,3)
cause_2010 <- rnorm(10,10,3)
cause_2011 <- rnorm(10,10,3)
df <- data.frame(year, price_2008, price_2009, price_2010, price_2011, cause_2008, cause_2009, cause_2010, cause_2011)
getPriceValue <- function(x){
columnPrice <- 1 + 2011 - x[1]
return(x[columnPrice])
}
getCauseValue <- function(x){
columnPrice <- 5 + 2011 - x[1]
return(x[columnPrice])
}
df$price <- apply(df,1,getPriceValue)
df$cause <- apply(df, 1, getCauseValue)
df
答案 1 :(得分:0)
或者,如果您更喜欢基于dplyr
的解决方案
set.seed(123)
year <- ceiling(runif(10, 2007, 2010))
price_2008 <- rnorm(10, 10, 3)
price_2009 <- rnorm(10, 10, 3)
price_2010 <- rnorm(10, 10, 3)
price_2011 <- rnorm(10, 10, 3)
cause_2008 <- rnorm(10, 10, 3)
cause_2009 <- rnorm(10, 10, 3)
cause_2010 <- rnorm(10, 10, 3)
cause_2011 <- rnorm(10, 10, 3)
df <-
data.frame(
year,
price_2008,
price_2009,
price_2010,
price_2011,
cause_2008,
cause_2009,
cause_2010,
cause_2011
)
require(tidyverse)
df %>%
gather(key = "cause", value = "value", -year) %>%
separate(col = "cause",
into = c("type", "type_year"),
sep = "_") %>%
filter(type_year == year) -> dta_res
# head(dta_res)
year type type_year value
1 2008 price 2008 15.145195
2 2008 price 2008 13.672245
3 2009 price 2009 4.100149
4 2009 price 2009 9.346075
5 2009 price 2009 7.813326
6 2009 price 2009 8.124882
cause
或
过滤值等。type_year
和type
列,但是您可以删除将select()
调用传递到dplyr
管道或使用remove
自变量{{1 }}如果愿意,可以分开通话。