【问题标题】:R: Add a new column to my dataframe by its nameR:按名称向我的数据框添加一个新列
【发布时间】:2020-12-22 21:43:14
【问题描述】:

我有一个数据集 (Y),其中包含不同的组名(Real.Madrid、Chelsea、Manchester...),并且每个组的值都不同:

   Real.Madrid      Chelsea         Manchester 
      420             446              339 
      PSG            Barcelona          Ajax 
      106             191             394 

这个数据集的类型是下一个:

num [1:6(1d)] 420 446 339 106 192 ...
- attr(*, "dimnames")=List of 1
..$ : chr [1:6] "Real.Madrid" "Chelsea" "Manchester" "PSG" ...

我还有一个数据框(df1):

    X    Team
1   2    Real.Madrid
2   3    Real Madrid 
3   5    Ajax
4   2    Barcelona
5   1    Manchester
6   3    PSG
7   6    Chelsea

我的目标是将第一个数据集附加到数据框中,并匹配团队名称,添加一个包含第一个数据集数值的新列:

    X    Team            Y
1   2    Real.Madrid    420
2   3    Real Madrid    420
3   5    Ajax           394
4   2    Barcelona      191
5   1    Manchester     339
6   3    PSG            106
7   6    Chelsea        446

如何合并这些值,将团队名称与“团队”列匹配?

【问题讨论】:

  • 请张贴dput 获取您的示例数据。

标签: r dataframe


【解决方案1】:

我猜你可以利用命名向量Y,例如,

df <- within(
  df,
  Y <- Y[Team]
)

这样

  X        Team   Y
1 2 Real.Madrid 420
2 3 Real.Madrid 420
3 5        Ajax 394
4 2   Barcelona 191
5 1  Manchester 339
6 3         PSG 106
7 6     Chelsea 446

数据

> dput(df)
structure(list(X = c(2L, 3L, 5L, 2L, 1L, 3L, 6L), Team = c("Real.Madrid", 
"Real.Madrid", "Ajax", "Barcelona", "Manchester", "PSG", "Chelsea"
)), class = "data.frame", row.names = c("1", "2", "3", "4", "5",
"6", "7"))
> dput(Y)
c(Real.Madrid = 420, Chelsea = 446, Manchester = 339, PSG = 106, 
Barcelona = 191, Ajax = 394)

【讨论】:

  • 嗨,当我执行此操作时,会显示数据框的预览,其中包含“Y”列。但是当我再次打开数据框时,该列就消失了。这是为什么呢?
  • @Jusep 我猜你错过了将上述代码分配给df,例如df &lt;- 。查看我的更新。
【解决方案2】:

我们可以将stack 命名向量放入一个两列数据集中,其中“ind”作为列名,“values”作为第二列,然后使用merge 进行左连接 (all.x = TRUE) base R

out <- merge(df1, stack(Y), by.x = 'Team', by.y = "ind", all.x = TRUE) 
names(out)[names(out) == 'values'] <- "Y"

-输出

out
#         Team X   Y
#1        Ajax 5 394
#2   Barcelona 2 191
#3     Chelsea 6 446
#4  Manchester 1 339
#5         PSG 3 106
#6 Real.Madrid 2 420
#7 Real.Madrid 3 420

或与tidyverse 一起使用enframe 和right_join

library(tibble)
library(dplyr)
enframe(Y, name = "Team", value = 'Y') %>%
     right_join(df1)

-输出

# A tibble: 7 x 3
#  Team            Y     X
#  <chr>       <dbl> <int>
#1 Real.Madrid   420     2
#2 Real.Madrid   420     3
#3 Chelsea       446     6
#4 Manchester    339     1
#5 PSG           106     3
#6 Barcelona     191     2
#7 Ajax          394     5

数据

df1 <- structure(list(X = c(2L, 3L, 5L, 2L, 1L, 3L, 6L), Team = c("Real.Madrid", 
"Real.Madrid", "Ajax", "Barcelona", "Manchester", "PSG", "Chelsea"
)), class = "data.frame", row.names = c("1", "2", "3", "4", "5", 
"6", "7"))

Y <- c(Real.Madrid = 420, Chelsea = 446, Manchester = 339, PSG = 106, 
Barcelona = 191, Ajax = 394)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 2018-02-09
    • 2015-10-23
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多