在R中创建一列新的连续标记(如n-gram)
我有这个数据集在R中创建一列新的连续标记(如n-gram),r,n-gram,R,N Gram,我有这个数据集 A B URBAN 1 PLAN 2 我希望像这样增加新的专栏 A A` B URBAN URB 1 URBAN RBA 1 URBAN BAN 1 PLAN PLA 2 PLAN LAN 2 如何在R中创建A'列?这里有一种可能的方法。我相信有更简洁的方法来处理这项工作。但我认为以下几点就可以了。对于mydf中的每一行,我应用substr()来创建三
A B
URBAN 1
PLAN 2
我希望像这样增加新的专栏
A A` B
URBAN URB 1
URBAN RBA 1
URBAN BAN 1
PLAN PLA 2
PLAN LAN 2
如何在R中创建A'列?这里有一种可能的方法。我相信有更简洁的方法来处理这项工作。但我认为以下几点就可以了。对于
mydf
中的每一行,我应用substr()
来创建三个字母元素。Map()
部件正在生成元素。由于存在一些不需要的元素,我进一步使用另一个lappy()
将它们子集化。最后,unnest()
library(tidyverse)
mydf %>%
mutate(whatever = lapply(1:nrow(mydf), function(x) {
unlist(Map(function(j, k) substr(mydf$A[x], start = j, stop = k),
1:nchar(mydf$A[x]), 3:nchar(mydf$A[x])))
}) %>%
lapply(function(x) x[nchar(x) ==3])) %>%
unnest(whatever)
A B whatever
1 URBAN 1 URB
2 URBAN 1 RBA
3 URBAN 1 BAN
4 PLAN 2 PLA
5 PLAN 2 LAN
数据
mydf <- structure(list(A = c("URBAN", "PLAN"), B = 1:2), .Names = c("A",
"B"), class = "data.frame", row.names = c(NA, -2L))
mydf这里有一种可能的方法。我相信有更简洁的方法来处理这项工作。但我认为以下几点就可以了。对于mydf
中的每一行,我应用substr()
来创建三个字母元素。Map()
部件正在生成元素。由于存在一些不需要的元素,我进一步使用另一个lappy()
将它们子集化。最后,unnest()
library(tidyverse)
mydf %>%
mutate(whatever = lapply(1:nrow(mydf), function(x) {
unlist(Map(function(j, k) substr(mydf$A[x], start = j, stop = k),
1:nchar(mydf$A[x]), 3:nchar(mydf$A[x])))
}) %>%
lapply(function(x) x[nchar(x) ==3])) %>%
unnest(whatever)
A B whatever
1 URBAN 1 URB
2 URBAN 1 RBA
3 URBAN 1 BAN
4 PLAN 2 PLA
5 PLAN 2 LAN
数据
mydf <- structure(list(A = c("URBAN", "PLAN"), B = 1:2), .Names = c("A",
"B"), class = "data.frame", row.names = c(NA, -2L))
mydf这里有一个与stru匹配的选项
library(stringr)
merge(stack(lapply(setNames(str_match_all(mydf$A, "(?=(...))"),
mydf$A), `[`, , 2))[2:1], mydf, by.x = 'ind', by.y = 'A')
或者使用与tidyverse
library(purrr)
library(dplyr)
mydf %>%
mutate(Anew = str_match_all(A, "(?=(...))") %>%
map(~.x[,2])) %>%
unnest
# A B Anew
#1 URBAN 1 URB
#2 URBAN 1 RBA
#3 URBAN 1 BAN
#4 PLAN 2 PLA
#5 PLAN 2 LAN
这里有一个带有str\u match
library(stringr)
merge(stack(lapply(setNames(str_match_all(mydf$A, "(?=(...))"),
mydf$A), `[`, , 2))[2:1], mydf, by.x = 'ind', by.y = 'A')
或者使用与tidyverse
library(purrr)
library(dplyr)
mydf %>%
mutate(Anew = str_match_all(A, "(?=(...))") %>%
map(~.x[,2])) %>%
unnest
# A B Anew
#1 URBAN 1 URB
#2 URBAN 1 RBA
#3 URBAN 1 BAN
#4 PLAN 2 PLA
#5 PLAN 2 LAN
结合你的想法和我的想法,一种方法如下<代码>数据%>%突变(无论什么=lappy(A,函数(y)rollappy(1:nchar(y),宽度=3,函数(x)substr(y,min(x),max(x‘‘‘)’)%>%unest(无论什么)
。这让我们少打字。结合你的想法和我的想法,一种方法是如下<代码>数据%>%突变(无论什么=lappy(A,函数(y)rollappy(1:nchar(y),宽度=3,函数(x)substr(y,min(x),max(x‘‘‘)’)%>%unest(无论什么)
。这样我们就可以少打字了。如果我们使用map()
或map()
,unest()
是这种操作的好朋友。我正在读你的代码。你能解释一下正则表达式吗?在这方面我还有很多东西要学。正则表达式是一个积极的展望。就其本身而言,它是不可捕获的,但是可以通过用括号((…)
)@akrun来捕获它。谢谢您提供的信息。我喜欢使用str\u match\u all()
的想法。这使得这项工作非常容易。这取决于顺序。如果第一个参数是data,第二个参数是names,则为yes。根据?walk
,walk()返回input.x(不可见)。这使得它易于在管道中使用。
@akrun非常感谢您。我将玩walk()
。最后几天不知何故是学习Map()
和Map()
的时候。现在我已经习惯了这些函数。如果我们使用map()
或map()
,unest()
是这种操作的好朋友。我正在读你的代码。你能解释一下正则表达式吗?在这方面我还有很多东西要学。正则表达式是一个积极的展望。就其本身而言,它是不可捕获的,但是可以通过用括号((…)
)@akrun来捕获它。谢谢您提供的信息。我喜欢使用str\u match\u all()
的想法。这使得这项工作非常容易。这取决于顺序。如果第一个参数是data,第二个参数是names,则为yes。根据?walk
,walk()返回input.x(不可见)。这使得它易于在管道中使用。
@akrun非常感谢您。我将玩walk()
。最后几天不知何故是学习Map()
和Map()
的时候。现在我已经习惯了这些功能。