【问题标题】:Moving elements from column to column in r在r中将元素从列移动到列
【发布时间】:2021-09-15 17:17:20
【问题描述】:

我有一个看起来像这样的数据框(但适用于每个美国县)

county state n_state_1 n_state_2 n_state_3 n_state_4
Autauga County AL NA FL NA NA
Baldwin County AL GA NA TN NA
Catron County AL FL GA NA CA

我想将非缺失值(FL、GA、TN 等)移动到从 n_state_1 开始的第一列,然后删除仅包含缺失值的列以获取:

county state n_state_1 n_state_2 n_state_3
Autauga County AL FL NA NA
Baldwin County AL GA TN NA
Catron County AL FL GA CA

我正在努力迈出第一步。我考虑过使用 distinct 函数,但它不起作用,因为每列中都有非空元素。

【问题讨论】:

标签: r dataframe


【解决方案1】:

您可以使用dplyrtidyr

library(dplyr)
library(tidyr)

df %>% 
  pivot_longer(starts_with("n_state")) %>% 
  drop_na() %>%
  group_by(county, state) %>% 
  mutate(name=row_number()) %>% 
  pivot_wider(names_prefix="n_state_")

返回

  county         state n_state_1 n_state_2 n_state_3
  <chr>          <chr> <chr>     <chr>     <chr>    
1 Autauga_County AL    FL        NA        NA       
2 Baldwin_County AL    GA        TN        NA       
3 Catron_County  AL    FL        GA        CA  

这里发生了什么?

  • pivot_longer 采用 n_state_{n}-columns 并将它们折叠成两列:name-column 包含原始列名称(n_state_1n_state_2 等),value-column 包含状态(@在许多情况下为 987654331@、GA&lt;NA&gt;)。
  • 接下来我们删除每个&lt;NA&gt; 条目。 (注意:我使用&lt;NA&gt; 来表明它是一个NA-值。)
  • 在按countystate 分组后,我们添加一个行号。这些数字稍后将用于创建新的列名。
  • pivot_wider 现在获取这些行号并在它们前面加上 n_state_ 以获取新列。这些值取自在第二行代码中创建的value 列。 pivot_wider&lt;NA&gt;-values 填充缺失值(默认行为)。

数据

structure(list(county = c("Autauga_County", "Baldwin_County", 
"Catron_County"), state = c("AL", "AL", "AL"), n_state_1 = c(NA, 
"GA", "FL"), n_state_2 = c("FL", NA, "GA"), n_state_3 = c(NA, 
"TN", NA), n_state_4 = c(NA, NA, "CA")), problems = structure(list(
    row = 3L, col = "n_state_4", expected = "", actual = "embedded null", 
    file = "literal data"), row.names = c(NA, -1L), class = c("tbl_df", 
"tbl", "data.frame")), class = c("spec_tbl_df", "tbl_df", "tbl", 
"data.frame"), row.names = c(NA, -3L), spec = structure(list(
    cols = list(county = structure(list(), class = c("collector_character", 
    "collector")), state = structure(list(), class = c("collector_character", 
    "collector")), n_state_1 = structure(list(), class = c("collector_character", 
    "collector")), n_state_2 = structure(list(), class = c("collector_character", 
    "collector")), n_state_3 = structure(list(), class = c("collector_character", 
    "collector")), n_state_4 = structure(list(), class = c("collector_character", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
    "collector")), skip = 1L), class = "col_spec"))

【讨论】:

  • 它完全按照我想要的方式工作:) 但即使在查看代码后我也没有完全遵循代码。特别是,我不明白第二行(pivot_longer 函数)和最后一行发生了什么。如果您能提供一些直觉,我将非常感激!
  • 添加了简要说明以清除代码。希望对您有所帮助。
【解决方案2】:

dapply 的另一个选项来自collapseselect 仅具有any 非NA 元素的列

library(collapse)
library(dplyr)
dapply(df1, MARGIN = 1, FUN = function(x) c(x[!is.na(x)], x[is.na(x)])) %>%
   select(where(~ any(complete.cases(.))))
# A tibble: 3 x 5
  county         state n_state_1 n_state_2 n_state_3
  <chr>          <chr> <chr>     <chr>     <chr>    
1 Autauga_County AL    FL        <NA>      <NA>     
2 Baldwin_County AL    GA        TN        <NA>     
3 Catron_County  AL    FL        GA        CA       

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 2019-10-30
    • 2011-10-22
    • 2019-02-08
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    相关资源
    最近更新 更多