我试图从数据框中隔离一些值 例如:
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不能正常工作
答案 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 1
,2
以及之前没有看过这些数字的第一个3
,但它看到了最后两个数字0
和{{1}先前。这意味着3
将返回!duplicated()
以获取数据的唯一值。
我们可以使用它来索引数据框,以获得具有唯一值TRUE
的{{1}}行,如下所示:
test_df0
但是这会返回数据框的所有列。如果我们只想要col1
和test_df0[!duplicated(test_df0[["col1"]]), ]
,我们也可以使用以下内容索引列:
col1
至于为什么循环不起作用,正如@Jacob所提到的那样,你没有将用col3
创建的值赋值给一个值,所以你创建的值在函数调用后消失。 / p>