R 按值拆分数据帧

R 按值拆分数据帧,r,split,dataframe,R,Split,Dataframe,如何拆分以下data.frame df <- data.frame(var1 = c("a", 1, 2, 3, "a", 1, 2, 3, 4, 5, 6, "a", 1, 2), var2 = 1:14) 所以基本上,第1列中的值“a”是我想要分割数据帧的标记/标识符。我知道split函数,但这意味着我必须添加另一列,因为从我的示例中可以看出,组的大小可能会有所不同,我不知道如何自动创建这样一个虚拟列以满足我的需要 有什么想法吗 干杯 Sven您可以找到索引向量的哪些值等于“a”,然

如何拆分以下data.frame

df <- data.frame(var1 = c("a", 1, 2, 3, "a", 1, 2, 3, 4, 5, 6, "a", 1, 2), var2 = 1:14)
所以基本上,第1列中的值“a”是我想要分割数据帧的标记/标识符。我知道split函数,但这意味着我必须添加另一列,因为从我的示例中可以看出,组的大小可能会有所不同,我不知道如何自动创建这样一个虚拟列以满足我的需要

有什么想法吗

干杯


Sven

您可以找到索引向量的哪些值等于“a”,然后在此基础上创建一个分组变量,然后使用split

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

您可以创建一个循环,循环数据帧的整个第一列,并将非数字字符的位置保存在向量中。因此,您会有如下情况:

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
}

数据这看起来像我建议的东西。你是我的克隆人吗?@JoshuaUlrich克隆人在你的名声中占有一定比例吗?如果是,那么是的。我已经给了你10,你还想要什么?天哪,克隆人很需要…;-)也谢谢你的代码片段。该解决方案的问题在于,其他非“a”的值也可以是文本,并不总是数字。也许我的例子设计得不够好。不过,知道这个解决方案也很好。谢谢!:)如果目标是找到不需要循环的位置。您可以执行类似于
的操作(df$var1==“a”)
。当使用R@Roland时,尽量避免将循环作为第一选择。我习惯于用python编程,所以这就是我倾向于使用循环的原因。我发现如何使用循环的扎实知识消除了记忆大量内置函数的需要,但您是如何感受到所有这些函数的?在很多情况下,我个人可能会使用这些函数,但我并不了解它们。通常,循环是在R中实现某些功能的效率最低的方法(按数量级)。这会激发您搜索(矢量化)函数的动机。
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
}