【问题标题】:R: Concat columns from data frame using wildcardsR:使用通配符从数据框中连接列
【发布时间】:2016-04-28 11:38:10
【问题描述】:

我在 R 中遇到了一个关于使用通配符连接数据框列的特定问题。也许我搜索错误。但是我还没有找到匹配的答案。

这是我的问题: 我有一个数据框 df ,其中每一列代表一个用户(U1,U2,U3),例如:

> df <-data.frame(U1=1:3, U2=4:6, U3=7:9)
> df
>  U1 U2 U3
1  1  4  7
2  2  5  8
3  3  6  9

我想将所有用户的值连接到一个向量中,就像使用 c() 函数一样,例如:

> c(df$U1, df$U2, df$U3)
[1] 1 2 3 4 5 6 7 8 9

但是,我的用户数量很大,并且随着时间的推移而变化。因此,我寻找一种优雅的动态方式来连接列,例如

> c(df$U*)

不幸的是,这似乎不起作用。我玩弄了 grep 和正则表达式,但无法让它工作。当然,我可以使用 for 循环并编写自己的 cat 函数,但我认为有更好的方法。我只是没找到。也许我只是个盲人。希望你能帮忙。

【问题讨论】:

  • 您想连接所有列还是仅连接一些列?即以 U?? 开头的列
  • 也许只是取消列出数据。 unlist(df[grepl("^U", names(df))], use.names = FALSE).

标签: regex r vector dataframe concat


【解决方案1】:
sub_df <- df[, grep(pattern ='^U.*', names(df))]    

stack(df)$values 

希望这对你有用。您可以根据需要先对一些列进行子集化。

【讨论】:

    【解决方案2】:

    先将数据框强制转换为矩阵:

    as.vector(as.matrix(df))
    

    使用方括号[ 选择名称与某个表达式匹配的列:

    df[, grep("U.*", colnames(df)), drop = FALSE]
    

    【讨论】:

    • 好吧,这适用于最简单的例子,如果他们在df 中也有变量"V1", "cats" 等怎么办? - 他们需要一种方法来选择所有 U(n)
    • @krlmlr 感谢您的建议,但正如@thelatemail 指出的那样,这不起作用,因为我的原始文件有列U(1)-U(x),V(1)-V(y), W(1)-W(z),我想将 U(1) 与 U(x) 连接成一个向量a、V(1) 到 V(y) 转化为向量 b,以此类推。
    • @deepdive - 您可能还想考虑 reshapestack 函数及其在 dplyrdata.table 世界中的表亲
    • @krlmlr 这有效:as.vector(as.matrix(df[, grep("U.*", colnames(df)), drop = FALSE])),即我只是结合了你的建议。干杯!
    猜你喜欢
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 2014-10-26
    • 2014-04-29
    • 2022-08-20
    • 2018-08-01
    相关资源
    最近更新 更多