【问题标题】:Transform columns and rows of a dataframe [duplicate]转换数据框的列和行[重复]
【发布时间】:2020-09-21 07:27:38
【问题描述】:

我有一个数据框:

ID   Value    Name    Score  Card_type  Card_number
1      NA     John     242      X           23
1     124     John      NA      X           23
1     124     John     242      Y           25
1     124     NA       242      Y           NA
2      55     Mike      NA      X           11
2      55     NA       431      X           11
2      55     Mike     431      Y           14
2      NA     Mike     431      Y           14

如您所见,IDs 有两个组 (Card_type),用于列 Card_number。同样如您所见,具有相同IDCard_type 的某些行在某些列中具有相同的缺失值。我想要得到的是,让每个ID 成为一排填充列。并且Card_number 列必须拆分为Card_number_type_XCard_number_type_X 两列,Card_type 列必须删除。

所以想要的结果必须是这样的:

ID   Value    Name    Score   Card_number_type_X  Card_number_type_Y
1     124     John     242             23                   25
2      55     Mike     431             11                   14                 

我该怎么做?

【问题讨论】:

  • 它们有多种方法可以做到这一点,请参阅tidyr::pivot_wider()stats::reshape(),您还可以查看reshape2 包。这里的问题是你想如何处理NA?
  • 也许this 有一些技巧可以帮助你。

标签: r dataframe


【解决方案1】:

一种方法是 fill 每个 ID 中的缺失值,然后获取仅保留唯一值的宽格式数据。

library(dplyr)
library(tidyr)

df %>%
  group_by(ID) %>%
  fill(everything(), .direction = 'updown') %>%
  pivot_wider(names_from = Card_type, values_from = Card_number, 
              values_fn = unique, names_prefix = 'Card_number_type_')

#     ID Value Name  Score Card_number_type_X Card_number_type_Y
#  <int> <int> <chr> <int>              <int>              <int>
#1     1   124 John    242                 23                 25
#2     2    55 Mike    431                 11                 14

看来原始数据和共享数据不一样,我们可以试试:

df %>%
    group_by(ID) %>%
    fill(everything(), .direction = 'updown') %>%
    distinct() %>%
    group_by(ID, Value, Name, Score) %>%
    mutate(row = row_number()) %>%
    pivot_wider(names_from = Card_type, values_from = Card_number, 
                names_prefix = 'Card_number_type_')

数据

df <- structure(list(ID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), Value = c(NA, 
124L, 124L, 124L, 55L, 55L, 55L, NA), Name = c("John", "John", 
"John", NA, "Mike", NA, "Mike", "Mike"), Score = c(242L, NA, 
242L, 242L, NA, 431L, 431L, 431L), Card_type = c("X", "X", "Y", 
"Y", "X", "X", "Y", "Y"), Card_number = c(23L, 23L, 25L, NA, 
11L, 11L, 14L, 14L)), class = "data.frame", row.names = c(NA, 
-8L))

【讨论】:

  • 谢谢,我的原始数据出现了这个错误:$&lt;-.data.frame(*tmp*, "val", value = c("24181", : 替换有 1304 行,数据有 1077 . 问题出现在 pivot_wider 部分
  • 您可以尝试更新答案,看看它是否适用于您的原始数据?
  • 出现新的代码列 Card_number_type_NA 和不必要的列行
  • 您可以通过 ungroup %&gt;% select(-row, -Card_number_type_NA) 删除不需要的列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-17
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多