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