在R中循环以搜索列名

时间:2018-11-27 06:32:13

标签: r

预先感谢您的帮助。

我在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])
 }}}

2 个答案:

答案 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_yeartype列,但是您可以删除将select()调用传递到dplyr管道或使用remove自变量{{1 }}如果愿意,可以分开通话。