【问题标题】:Split data.frame by value按值拆分 data.frame
【发布时间】:2012-07-09 06:24:17
【问题描述】:

如何拆分以下data.frame

df <- data.frame(var1 = c("a", 1, 2, 3, "a", 1, 2, 3, 4, 5, 6, "a", 1, 2), var2 = 1:14)

进入/组列表

a 1
1 2
2 3
3 4

a 5
1 6
2 7
3 8
4 9
5 10
6 11

a 12
1 13
2 14

所以基本上,第 1 列中的值“a”是我想要拆分数据框的标签/标识符。我知道拆分功能,但这意味着我必须添加另一列,因为从我的示例中可以看出,组的大小可能会有所不同,我不知道如何自动创建这样一个虚拟列以满足我的需要。

对此有什么想法吗?

干杯,

斯文

【问题讨论】:

    标签: r split dataframe


    【解决方案1】:

    您可以找到索引向量的哪些值等于“a”,然后根据该值创建一个分组变量,然后使用拆分。

    df[,1] == "a"
    # [1]  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
    #[13] FALSE FALSE
    cumsum(df[,1] == "a")
    # [1] 1 1 1 1 2 2 2 2 2 2 2 3 3 3
    split(df, cumsum(df[,1] == "a"))
    #$`1`
    #  var1 var2
    #1    a    1
    #2    1    2
    #3    2    3
    #4    3    4
    #
    #$`2`
    #   var1 var2
    #5     a    5
    #6     1    6
    #7     2    7
    #8     3    8
    #9     4    9
    #10    5   10
    #11    6   11
    #
    #$`3`
    #   var1 var2
    #12    a   12
    #13    1   13
    #14    2   14
    

    【讨论】:

    • 这看起来有点像我建议的。你是我的克隆人吗?
    • @JoshuaUlrich 克隆人会从你的声誉中获得一定比例吗?如果是,那么是的。
    • 我已经给了你10个,你还想要什么?天哪,克隆人很需要... ;-)
    【解决方案2】:

    您可以创建一个循环,循环遍历数据框的整个第一列,并将非数字字符的位置保存在向量中。因此,你会有类似的东西:

    data <- df$var1 #this gives you a vector of the values you'll sort through
    
    positions <- c()
    
    for (i in seq(1:length(data))){
        if (is.numeric(data[i]) == TRUE) {
            #nothing
        }
        else positions <- append(positions, i) #saves the positions of the non-numeric characters
    }
    

    有了这些位置,从那里访问拆分数据框应该不会有问题。这只是在位置向量中的值之间使用序列的问题。

    【讨论】:

    • 也感谢您的代码 sn-p。该解决方案的问题在于,不是“a”的其他值也可以是文本,并不总是数字。也许我的例子设计得不够好。但是,也很高兴知道该解决方案。谢谢! :)
    • 如果目标是找到不需要循环的位置。你可以做类似which(df$var1=="a") 的事情。在使用 R 时,尽量避免循环作为您的首选。
    • @Roland 我习惯用 python 编程,所以这就是我倾向于使用循环的原因。我发现对如何使用循环的扎实知识消除了记住大量内置函数的需要,但是你是如何对所有这些函数有感觉的呢?可能有很多我个人可以使用这些功能的实例,但不知道它们。
    • 循环通常是在 R 中实现某些东西的效率最低的方法(按数量级)。这会激发您搜索(矢量化)函数的动力。
    猜你喜欢
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多