“for”循环不起作用

时间:2016-11-29 18:43:03

标签: r for-loop dataframe

我试图从数据框中隔离一些值 例如:

test_df0<- data.frame('col1'= c('string1', 'string2', 'string1'),
'col2' = c('value1', 'value2', 'value3'),
'col3' = c('string3', 'string4', 'string3'))

我想获得一个新的数据帧,它只包含来自col1的唯一字符串,以及来自col3的相关字符串(对于具有相同col1的行,它们将是相同的。 这是我写的循环,但我必须做一些直言不讳的错误:

test_df1<- as.data.frame(matrix(ncol= 2, nrow=0))
colnames(test_df1)<- c('col1', 'col3')
for (i in unique(test_df0$col1)){
  first_matching_row<- match(x = i, table = test_df0$col1)
  temp_df<-
    data.frame('col1'= i,
               'col3'= test_df0[first_matching_row, 'col3'])
  rbind(test_df1, temp_df)}

生成的test_df1虽然为空。无法发现循环中的错误,我将不胜感激任何建议。

编辑:for循环正在工作,如果它的最后一行是print(temp_df)而不是rbind命令,我得到正确的结果。我不确定为什么rbind不能正常工作

2 个答案:

答案 0 :(得分:2)

你实际上并没有向任何事情提供任何帮助!大概你需要这样的东西:

test_df1 <- rbind(test_df1, temp_df)

答案 1 :(得分:2)

更简单快捷的方法是使用duplicated()功能。 duplicated()查看并输入向量,如果在向量中的较早索引处看到该值,则返回TRUE。例如:

> duplicated(c(0,0,0,1,2,3,0,3))
[1] FALSE  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE

因为0的第一个值以前没有见过,但是对于接下来的两个它有。 for 12以及之前没有看过这些数字的第一个3,但它看到了最后两个数字0和{{1}先前。这意味着3将返回!duplicated()以获取数据的唯一值。

我们可以使用它来索引数据框,以获得具有唯一值TRUE的{​​{1}}行,如下所示:

test_df0

但是这会返回数据框的所有列。如果我们只想要col1test_df0[!duplicated(test_df0[["col1"]]), ] ,我们也可以使用以下内容索引列:

col1

至于为什么循环不起作用,正如@Jacob所提到的那样,你没有将用col3创建的值赋值给一个值,所以你创建的值在函数调用后消失。 / p>