如何为R中的每个不同列选择不同行中的值?

如何为R中的每个不同列选择不同行中的值?,r,dplyr,tidyr,R,Dplyr,Tidyr,我有两个数据框,数据1是关于孩子的年龄。对于不同的年份,数值是不同的 data2仍然是每个年龄段的人口数据,列名仍然是year 我想要的是将人口信息提取到一个新的数据帧中。但2008/2009/2010年的人口数据应为7-10岁。但2011/2012/2013年的人口数据应为6-9岁 有人知道吗 data2 = data.frame('population by age' = seq(5, 11, by = 1), '2008' = c(145391,

我有两个数据框,数据1是关于孩子的年龄。对于不同的年份,数值是不同的

data2仍然是每个年龄段的人口数据,列名仍然是year

我想要的是将人口信息提取到一个新的数据帧中。但2008/2009/2010年的人口数据应为7-10岁。但2011/2012/2013年的人口数据应为6-9岁

有人知道吗

data2 = data.frame('population by age' = seq(5, 11, by = 1), 
                     '2008' = c(145391,
                                140621,
                                136150,
                                131944,
                                198933,
                                182182,
                                159103
                     ),  
                     '2009' = c(148566,
                                143943,
                                139367,
                                135083,
                                212196,
                                196398,
                                155033
                     ), 
                     '2010' = c(152330,
                                147261,
                                142555,
                                138172,
                                218701,
                                161330,
                                142190
                     ),  
                     '2011' = c(156630,
                                151387,
                                146491,
                                141905,
                                119397,
                                116093,
                                112666
                     ),
                     '2012' = c(133545,
                                129737,
                                126124,
                                122678,
                                120213,
                                116826,
                                113381
                      ),
                     '2013' = c(119397,
                                116093,
                                112666,
                                109174,
                                106871,
                                103659,
                                100398)) 



                 data1 <- data.frame('2008'= c(7,
                                               8,
                                               9,
                                               10),
                                     '2009' = c(7,
                                                8,
                                                9,
                                                10),
                                     '2010' = c(7,
                                                8,
                                                9,
                                                10),
                                     '2011' = c(6,
                                                7,
                                                8,
                                                9),
                      '2012' = c(6,
                                 7,
                                 8,
                                 9),
                      '2013' = c(6,
                                 7,
                                 8,
                                 9)
                      )
data2=data.frame('population by age'=seq(5,11,by=1),
‘2008’=c(145391,
140621,
136150,
131944,
198933,
182182,
159103
),  
‘2009’=c(148566,
143943,
139367,
135083,
212196,
196398,
155033
), 
‘2010’=c(152330,
147261,
142555,
138172,
218701,
161330,
142190
),  
“2011”=c(156630,
151387,
146491,
141905,
119397,
116093,
112666
),
“2012”=c(133545,
129737,
126124,
122678,
120213,
116826,
113381
),
“2013”=c(119397,
116093,
112666,
109174,
106871,
103659,
100398)) 

数据1我们可以
将第二个数据集收集成“长”格式,
根据条件过滤
,并
扩展成“宽”

library(tidyverse)
gather(data2, key, val, X2008:X2013) %>% 
     filter((population.by.age %in% 7:10 & key %in% paste0("X", 2008:2010))|
            (population.by.age %in% 6:9 & key %in% paste0("X", 2011:2013))) %>% 
     spread(key, val)
#population.by.age  X2008  X2009  X2010  X2011  X2012  X2013
#1                 6     NA     NA     NA 151387 129737 116093
#2                 7 136150 139367 142555 146491 126124 112666
#3                 8 131944 135083 138172 141905 122678 109174
#4                 9 198933 212196 218701 119397 120213 106871
#5                10 182182 196398 161330     NA     NA     NA

在我看来,你想要其中一个:

library(tidyverse)

data2 %>%
  gather(year,value,-population.by.age) %>%
  inner_join(gather(data1,year,population.by.age)) %>%
  spread(year,value)

# population.by.age  X2008  X2009  X2010  X2011  X2012  X2013
# 1                 6     NA     NA     NA 151387 129737 116093
# 2                 7 136150 139367 142555 146491 126124 112666
# 3                 8 131944 135083 138172 141905 122678 109174
# 4                 9 198933 212196 218701 119397 120213 106871
# 5                10 182182 196398 161330     NA     NA     NA


data2 %>%
  gather(year,value,-population.by.age) %>%
  inner_join(gather(data1,year,population.by.age)) %>%
  group_by(year) %>%
  mutate(population.by.age = letters[row_number()]) %>%
  spread(year,value)

# # A tibble: 4 x 7
# population.by.age  X2008  X2009  X2010  X2011  X2012  X2013
# <chr>              <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
# 1 a                 136150 139367 142555 151387 129737 116093
# 2 b                 131944 135083 138172 146491 126124 112666
# 3 c                 198933 212196 218701 141905 122678 109174
# 4 d                 182182 196398 161330 119397 120213 106871
库(tidyverse)
数据2%>%
聚集(年,值,-按年龄划分的人口)%>%
内部联接(收集(数据1,年份,人口按年龄))%>%
价差(年、价值)
#按年龄划分的人口X2008 X2009 X2010 X2011 X2012 X2013
#1 6 NA NA 151387 129737 116093
# 2                 7 136150 139367 142555 146491 126124 112666
# 3                 8 131944 135083 138172 141905 122678 109174
# 4                 9 198933 212196 218701 119397 120213 106871
#510182182196398161330不适用不适用不适用
数据2%>%
聚集(年,值,-按年龄划分的人口)%>%
内部联接(收集(数据1,年份,人口按年龄))%>%
组别(年份)%>%
突变(population.by.age=字母[row_number()])%>%
价差(年、价值)
##A tibble:4 x 7
#按年龄划分的人口X2008 X2009 X2010 X2011 X2012 X2013
#                         
#1 a 136150 139367 142555 151387 129737 116093
#2 b 131944 135083 138172 146491 126124 112666
#3 c 198933 212196 218701 141905 122678 109174
#4 d 182182196398161330 119397 120213 106871
下面是第二种情况的基本版本,无需进行长/宽格式的重新设置:

data3 <- data1
data3[] <- Map(function(x,y) y[data2[[1]] %in% x,drop=FALSE],data1,data2[-1])
data3
#    X2008  X2009  X2010  X2011  X2012  X2013
# 1 136150 139367 142555 151387 129737 116093
# 2 131944 135083 138172 146491 126124 112666
# 3 198933 212196 218701 141905 122678 109174
# 4 182182 196398 161330 119397 120213 106871

data3它不是很优雅,但是你可以试试这个:

aux <- data2 %>% 
  select(population.by.age,X2008,X2009,X2010) %>% 
  filter(population.by.age > 6, 
         population.by.age < 10)


aux2 <- data2 %>% 
  select(population.by.age,X2011,X2012,X2013) %>% 
  filter(population.by.age > 5, 
         population.by.age < 9)

df <- full_join(aux,aux2) %>% 
  arrange(population.by.age)
aux%
选择(按年龄划分的人口,X2008、X2009、X2010)%>%
筛选(人口年龄>6,
人口(按年龄<10岁)
aux2%
选择(按年龄划分的人口,X2011、X2012、X2013)%>%
筛选(人口年龄>5,
人口(按年龄<9岁)
df%
安排(按年龄划分的人口)

祝你好运

使用
tidyverse

stack(data1)%>%
   mutate(val=data2[cbind(match(values,data2[,1]),as.numeric(ind))])%>%
   spread(ind,val)

  values X2008  X2009  X2010  X2011  X2012  X2013
1      6    NA     NA     NA 147261 151387 129737
2      7     7 136150 139367 142555 146491 126124
3      8     8 131944 135083 138172 141905 122678
4      9     9 198933 212196 218701 119397 120213
5     10    10 182182 196398     NA     NA     NA
使用基本R:

xtabs(val~.,cbind(a<-stack(data1),val=data2[cbind(a$values-4,as.numeric(a$ind))]))
      ind
values  X2008  X2009  X2010  X2011  X2012  X2013
    6       0      0      0 147261 151387 129737
    7       7 136150 139367 142555 146491 126124
    8       8 131944 135083 138172 141905 122678
    9       9 198933 212196 218701 119397 120213
    10     10 182182 196398      0      0      0

xtabs(val~,cbind)(我现在还记得你:)