根据特定条件重新排列表格并使用for循环

时间:2019-02-20 12:37:48

标签: r

我将直接从代码开始,这应该使目标明确:

library(gapminder)    
head(gapminder)

    # A tibble: 6 x 6
  country     continent  year lifeExp      pop gdpPercap
  <fct>       <fct>     <int>   <dbl>    <int>     <dbl>
1 Afghanistan Asia       1952    28.8  8425333      779.
2 Afghanistan Asia       1957    30.3  9240934      821.
3 Afghanistan Asia       1962    32.0 10267083      853.
4 Afghanistan Asia       1967    34.0 11537966      836.
5 Afghanistan Asia       1972    36.1 13079460      740.
6 Afghanistan Asia       1977    38.4 14880372      786.

将国家/地区名称保存在另一个变量中:

y <- unique(gapminder$country, incomparables = FALSE)
    length(y)
    [1] 142
    df.names <- paste(y, sep = "")

预期输出:

我想为year有142列+1,并且只有pop值。我正在尝试的代码是这样的:

for(i in 1:length(y)){
  d.frame[,i] <- gapminder$pop %>% filter(gapminder$country==y[i])
  assign(df.names[i], d.frame)
} 

此代码尝试分配与行中每个pop相对应的year值,并且列名是其对应的country。代码中未使用year,因为我稍后会添加该值,现在仅根据条件选择countrypop值。由于该表中的年份是重复的,因此我希望该列仅显示一次(以后)。因此,最终表必须为12 * 143表(12行和143列)。这不起作用。

有什么想法吗?如果需要,我也希望对设计和结构提出任何建议。

1 个答案:

答案 0 :(得分:1)

认为这就是您想要的:

gapminder %>%
    select(country, pop, year) %>%
    spread(country, pop)

这每年为您提供一行,每个国家为您提供一列,其中包含该年的人口。

({spread是{tidyr}软件包的一部分。)