我有一个像这样的数据框
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
我不明白为什么所有行只从第一行的数组中获取值
答案 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"