R 从现有列创建列的数据框只考虑第一行

R 从现有列创建列的数据框只考虑第一行,r,split,dataframe,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

我有一个这样的数据帧

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 

我不明白为什么所有的行都只从第一行的数组中获取值,我想您实际上想要:

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

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

我认为您实际上想要:

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

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

我认为您实际上想要:

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

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

我认为您实际上想要:

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

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

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

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"
有一些软件包(如“stringi”和“stringr”)使这类事情更容易完成

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"

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

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"
有一些软件包(如“stringi”和“stringr”)使这类事情更容易完成

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"

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

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"
有一些软件包(如“stringi”和“stringr”)使这类事情更容易完成

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"

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

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"
有一些软件包(如“stringi”和“stringr”)使这类事情更容易完成

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"

谢谢。请您解释一下“[”?“[”是一个提取函数,与执行x[1]相同。请参阅内联帮助中的?提取。非常感谢。请您解释一下“[”?“[”是一个提取函数,与执行x[1]相同,它的用途是什么.See?在内联帮助中提取。非常感谢。请您解释一下“[”?“[”是一个提取函数,与执行x[1]相同。请参阅内联帮助中的?提取。非常感谢。请您解释一下“[”?“[”是一个提取函数,与执行x[1]相同,它的用途是什么。请参阅?内联帮助中的摘录。在某些方面可能更简单。+1在某些方面可能更简单。+1在某些方面可能更简单。+1在某些方面可能更简单。+1在某些方面可能更简单。+1