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