R在不使用for循环的情况下创建新列
假设我有一个数据框,第一列有几个数字。我想获取这些数字,将它们用作字符串中的位置,并获取包含该位置前后两个字符的子字符串。澄清一下,R在不使用for循环的情况下创建新列,r,for-loop,R,For Loop,假设我有一个数据框,第一列有几个数字。我想获取这些数字,将它们用作字符串中的位置,并获取包含该位置前后两个字符的子字符串。澄清一下, aggSN <- data.frame(V1=c(5,6,7,8),V2="blah") gen <- "AJSDAFKSDAFJKLASDFKJKA" # <- take this string aggSN # <- take the numbers in the first col
aggSN <- data.frame(V1=c(5,6,7,8),V2="blah")
gen <- "AJSDAFKSDAFJKLASDFKJKA" # <- take this string
aggSN # <- take the numbers in the first column
# V1 V2
# 5 blah
# 6 blah
# 7 blah
# 8 blah
aggSN您可以使用substring()
而无需编写循环
aggSN <- data.frame(V1=c(5,6,7,8,2),V2="blah")
gen <- "AJSDAFKSDAFJKLASDFKJKA"
with(aggSN, substring(gen, V1-2, V1+2))
# [1] "SDAFK" "DAFKS" "AFKSD" "FKSDA" "AJSD"
aggSN
用你不同的例子
> aggSN
V1 V2 V3
1 5 blah SDAFK
2 6 blah DAFKS
3 7 blah AFKSD
4 10 blah SDAFJ
5 2 blah AJSD
如果边界超出范围1,会发生什么情况。。长度(gen)?我会在这篇评论后不久编辑我的帖子,但我想把子字符串剪掉。它应该是aggSN[j,V1]
,不是吗?在创建V3之后,你在aggSN中的“10”是从哪里来的?对不起,你说得对,我把它改成了aggSN[j,V1]
可再现示例与显示V3
的示例不同。后一个是我所说的“不同的例子”。我猜你的答案没有加载。这就是路。总有一天我会像专业人士一样学会如何使用和子字符串。有趣的是,我不知道substr
和substring
之间的区别。我最初的尝试是使用和substr
生成一个常量向量,然后切换到sapply
。这肯定更好。@MichaelChirico-我删除了几分钟,然后意识到我做对了。很抱歉。@Ricky我不得不?substr
提醒自己。我最初认为接受向量索引的是substr
。参见?substr
aggSN <- data.frame(V1=c(5,6,7,8,2),V2="blah")
gen <- "AJSDAFKSDAFJKLASDFKJKA"
with(aggSN, substring(gen, V1-2, V1+2))
# [1] "SDAFK" "DAFKS" "AFKSD" "FKSDA" "AJSD"
aggSN$V3 <- with(aggSN, substring(gen, V1-2, V1+2))
aggSN
# V1 V2 V3
# 1 5 blah SDAFK
# 2 6 blah DAFKS
# 3 7 blah AFKSD
# 4 8 blah FKSDA
# 5 2 blah AJSD
aggSN$V3 <- sapply(aggSN$V1, function(x) substr(gen, x-2, x+2))
> aggSN
V1 V2 V3
1 5 blah SDAFK
2 6 blah DAFKS
3 7 blah AFKSD
4 8 blah FKSDA
> aggSN
V1 V2 V3
1 5 blah SDAFK
2 6 blah DAFKS
3 7 blah AFKSD
4 10 blah SDAFJ
5 2 blah AJSD