现有列中的数据框创建列仅考虑第一行

时间:2014-07-09 05:42:24

标签: r split dataframe

我有一个像这样的数据框

head(test)
                     sku               array                 
1 AQ665ELABLKLANID-81796       0,0,0,1,1,1,2            
2 AQ665ELABLKMANID-81797   2,0,0,0,1,1,0,0,1              
3 AQ665ELABLKNANID-81798     0,1,2,1,1,0,4,1           
4 AQ665ELABLKOANID-81799             0,1,0,1            
5 AQ665ELABLKPANID-81800     1,4,4,2,3,7,2,2             
6 AQ665ELABLKRANID-81802             0,1,1,0            

我想添加一个名为first的列,它为每一行包含数组的第一个元素:

test$first = strsplit(test$array,",")[[1]][1]

但我得到的是以下内容:

head(test)
                     sku               array   first             
1 AQ665ELABLKLANID-81796       0,0,0,1,1,1,2   0            
2 AQ665ELABLKMANID-81797   2,0,0,0,1,1,0,0,1   0              
3 AQ665ELABLKNANID-81798     0,1,2,1,1,0,4,1   0           
4 AQ665ELABLKOANID-81799             0,1,0,1   0            
5 AQ665ELABLKPANID-81800     1,4,4,2,3,7,2,2   0             
6 AQ665ELABLKRANID-81802             0,1,1,0   0 

我不明白为什么所有行只从第一行的数组中获取值

2 个答案:

答案 0 :(得分:2)

我认为你真的想要:

test$first <- sapply(strsplit(test$array,","),"[",1)
test

#                     sku             array first
#1 AQ665ELABLKLANID-81796     0,0,0,1,1,1,2     0
#2 AQ665ELABLKMANID-81797 2,0,0,0,1,1,0,0,1     2
#3 AQ665ELABLKNANID-81798   0,1,2,1,1,0,4,1     0
#4 AQ665ELABLKOANID-81799           0,1,0,1     0
#5 AQ665ELABLKPANID-81800   1,4,4,2,3,7,2,2     1
#6 AQ665ELABLKRANID-81802           0,1,1,0     0

在你的尝试中,

strsplit(test$array,",")[[1]]

为您提供了test$array[1]的拆分版本,然后您可以从中对第一个元素进行子集化,恰好是0。因此,您的所有值最终都为0

答案 1 :(得分:1)

我想一些正则表达式也可以在这里使用。以下内容可能会派上用场:

gsub("(^[0-9]+)(,.*)", "\\1", test$array)
# [1] "0" "2" "0" "0" "1" "0"
gsub("(^.*?),(.*)", "\\1", test$array, perl=TRUE)
# [1] "0" "2" "0" "0" "1" "0"

有一些软件包(例如&#34; stringi&#34;和&#34; stringr&#34;)使这种东西更容易做到。

library(stringi)
stri_extract_first_regex(test$array, pattern="[0-9]+")
# [1] "0" "2" "0" "0" "1" "0"

这也可以让您轻松地使用以下内容提取最后一个值:

stri_extract_last_regex(test$array, pattern="[0-9]+")
# [1] "2" "1" "1" "1" "2" "0"