用于R中的循环在列名中搜索

用于R中的循环在列名中搜索,r,R,提前感谢您的帮助 我在R中有一个数据框,其中有一个年份列(Year=2008-2017)用于各个行,还有一些列的标题如下(Price_2008、Cause_2008、Price_2009、Cause_2009等) 我们的想法是在dataframe中创建另外两列,标题为Price和Cause,通过查看年份来指向正确的列来获取数据。(即:如果年份=2018年,选择2018年价格和2018年原因) 任何这样做的想法都是非常感谢的!我是R的新手,不能在SAS做这件事 谢谢 新增代码: for (i in

提前感谢您的帮助

我在R中有一个数据框,其中有一个年份列(Year=2008-2017)用于各个行,还有一些列的标题如下(Price_2008、Cause_2008、Price_2009、Cause_2009等)

我们的想法是在dataframe中创建另外两列,标题为Price和Cause,通过查看年份来指向正确的列来获取数据。(即:如果年份=2018年,选择2018年价格和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])
 }}}
for(c中的i(2008:2017)){
对于(j in 1:nrow(abc)){

如果(abc$year[j]==i){(abc$Price[j],您可以编写一个函数来获取价格和原因值,并在每行应用该值

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
year或者如果您更喜欢基于

资料 结果 笔记
  • 我认为这本书很容易阅读,并且给你留下了扩展的空间 过滤器,无论您是否要匹配年份,只过滤原因还是 筛选值等
  • 我已经留下了
    type\u year
    type
    列,但是如果愿意,您可以删除通过
    select()
    调用
    dplyr
    管道或使用
    remove
    中的
    参数
    调用的列

欢迎来到StackOverflow!请阅读关于和如何给出答案的信息。这将使其他人更容易帮助您。请先向我们展示您的努力。我认为如果您提供一些示例数据和期望的结果,对这个问题进行一点改进,这个问题就可以了。

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