【问题标题】:The matching columns from a data frame based on value in a column from other data Frame基于来自其他数据框的列中的值匹配来自数据框的列
【发布时间】:2016-12-27 03:03:00
【问题描述】:

我有两个数据框 第一个是df1有485513列100行,

head(df1)

sample  cg1 cg2 cg3 cg4 cg5 cg6 cg7 cg8 cg9 cg10    cg11
AAD_1   33435   33436   33437   33438   33439   33440   33441   33442   33443   33444   33445
AAD_2   0.33    1.33    2.33    3.33    4.33    5.33    6.33    7.33    8.33    9.33    10.33
AAD_3   0.56    1.56    2.56    3.56    4.56    5.56    6.56    7.56    8.56    9.56    10.56
AAD_4   45.9    46.9    47.9    48.9    49.9    50.9    51.9    52.9    53.9    54.9    55.9
AAD_5   46.9    47.9    48.9    49.9    50.9    51.9    52.9    53.9    54.9    55.9    56.9
AAD_6   47.9    48.9    49.9    50.9    51.9    52.9    53.9    54.9    55.9    56.9    57.9
AAD_7   48.9    49.9    50.9    51.9    52.9    53.9    54.9    55.9    56.9    57.9    58.9
AAD_8   49.9    50.9    51.9    52.9    53.9    54.9    55.9    56.9    57.9    58.9    59.9
AAD_9   50.9    51.9    52.9    53.9    54.9    55.9    56.9    57.9    58.9    59.9    60.9
AAD_10  51.9    52.9    53.9    54.9    55.9    56.9    57.9    58.9    59.9    60.9    61.9

第二个有 df2 84 行和单列。我的目标是使用 df2 数据框中列中的值获取 df1 的子集。

head(df2)
    ID
    cg1
    cg2
    cg3
    cg4
    cg5

df2 的值是我对 df1 感兴趣的列名,因此我在 R 中尝试了以下单行代码。

> UP=(df1 %>% as.data.frame)[,df2$ID]

Up 数据框返回我的查询 df2 中不匹配的列

它生成了一个包含 84 列和 100 行的数据框,但上述命令行返回的列均与输入查询数据框 df2 不匹配。

如果有人建议我另一种解决方案,那就太好了

【问题讨论】:

  • 为什么这个问题同时有 Pandas 和 R 的标签?您在寻找哪种解决方案?
  • 其实R更好

标签: python r pandas


【解决方案1】:

假设df2 是一个系列:

>>> df[df2.tolist()]

        cg1       cg2       cg3       cg4       cg5
0  33435.00  33436.00  33437.00  33438.00  33439.00
1      0.33      1.33      2.33      3.33      4.33
2      0.56      1.56      2.56      3.56      4.56
3     45.90     46.90     47.90     48.90     49.90
4     46.90     47.90     48.90     49.90     50.90
5     47.90     48.90     49.90     50.90     51.90
6     48.90     49.90     50.90     51.90     52.90
7     49.90     50.90     51.90     52.90     53.90
8     50.90     51.90     52.90     53.90     54.90
9     51.90     52.90     53.90     54.90     55.90

如果它是一个数据框,那么这应该可以工作:

df[df2.ID.tolist()]

【讨论】:

  • OP 想要 R 解决方案?
  • 不管语言混乱,这都是一个有用的答案。 @Alexander df2.squeeze().tolist() 呢?
  • @piRSquared 我相信df.ID 更明确。它使其他人阅读它的代码更加清晰。
【解决方案2】:

R,我们可以这样做

df[as.character(df2$ID)]

假设“ID”列是factor。如果是character类,那就更简单了

df[df2$ID]

但如果'id'中有元素不在'df'的列名中,使用intersect可能会更好

df[intersect(colnames(df), df2$ID)]

如果“df”是data.table,对列进行子集化的常用方法是包含with =FALSE?data.table中提到过

默认情况下 with=TRUE 并且 j 在 x 的框架内计算;柱子 名称可以用作变量。

当 with=FALSE j 是列名的字符向量时,数字 要选择的列位置向量或 startcol:endcol 形式, 并且返回的值始终是 data.table。 with=FALSE 通常是 在 data.table 中用于动态选择列。注意 x[, cols, with=FALSE] 等价于 x[, .SD, .SDcols=cols]。

因此,上述命令将是

 df[, as.character(df2$ID), with = FALSE]

 df[, df2$ID, with = FALSE] #if 'ID' is already character class.

或者

 df[, intersect(colnames(df), df2$ID), with = FALSE]

【讨论】:

  • 上述R一班轮报错为;当 i 是 data.table (或字符向量)时, x 必须是键控的(即已排序,并且,标记为已排序),因此 data.table 知道要加入哪些列并利用 x 进行排序。先调用 setkey(x,...),见 ?setkey。
  • @user1017373 我假设您的数据集为data.frame,从您的输入中我无法收集到它是data.table 或data.frame。如果是data.table,df[, as.character(df2$ID), with = FALSE]
  • df1 从 data.table.its data.table 读取为 fread,是的,你是对的。
  • @user1017373 好的,那么with = FALSE 应该会成功。
  • 谢谢它的工作..现在我在 UP 中完美匹配:) :)
猜你喜欢
  • 2018-03-29
  • 1970-01-01
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多