连接两个具有共同元素的字符串
Concatenate two strings with common elements
我正在研究 R 中的一个简单问题(但我还没有弄明白;p):
给定一个向量 vect1 <- c("Andy+Pete", "Mary + Pete", "Pete+ Amada", ..., "Amada + Steven", "Steven + Henry")
。我想创建一个新向量 vect2
,其中包含 vect1
中的所有元素和 共享以下内容的新元素 属性:对于每两个字符串"A+B"
和 "B+C"
,我们将其连接成 "A+C"
,并将这个新元素添加到 vect2
。谁能帮我做这个吗?
另外,我想获取所有每个字符串中站在+
前面的元素,下面的代码正确吗?
for (i in length(vect1)){
vect3[i] <- regexpr(".*+", vect1[i])
}
第 3 个问题:如果我有一个数据框 d
,其中有一个 Date
列,格式为 %d-%b
(例如,01-Apr
),我该如何排序基于 Date
的递增顺序的数据帧??假设 d <- c(
01-Apr,
01-Mar,
02-Jan,
31-June,
30-May)
.
我认为应该这样做,但我做了一些我可能不应该做的事情...比如增长对象和嵌套 for
循环。如果要访问“+”前面的所有元素,只需使用 name.matrix[,1]
.
vect1 <- c("Andy+Pete", "Mary + Pete", "Pete+ Amada","Amada + Steven", "Steven + Henry")
library(stringr)
name.matrix <- matrix(do.call('rbind',str_split(vect1, pattern = "\s?[+]\s?")), ncol = 2)
new.stuff <- c()
for(x in unique(name.matrix[,2])){
sub.mat.1 <- matrix(name.matrix[name.matrix[,2] == x,], ncol = 2)
sub.mat.2 <- matrix(name.matrix[name.matrix[,1] == x,], ncol = 2)
if(length(sub.mat.1) && length(sub.mat.2)){
for(y in seq_along(sub.mat.1[,2])){
new.add <- paste0(sub.mat.1[y,1],'+', sub.mat.2[,2])
new.stuff <- c(new.stuff, new.add)
}
}
}
vect2 <- c(vect1, new.stuff)
vect2
#[1] "Andy+Pete" "Mary + Pete" "Pete+ Amada" "Amada + Steven" "Steven + Henry" "Andy+Amada"
#[7] "Mary+Amada" "Pete+Steven" "Amada+Henry"
更新:
第三个问题。那么六月只有 30 天。所以你会在那里得到一个 NA。如果您尝试根据日期对 data.frame 进行排序,则需要使用格式 df[order(df$Date),]
。 lubridate
包在处理日期时也可能有帮助。
d <- c('01-Apr','01-Mar','02-Jan','31-June','30-May')
d.new <- as.Date(d, format = '%d-%b')
d.new <- d.new[order(d.new)]
d.new
#[1] "2018-01-02" "2018-03-01" "2018-04-01" "2018-05-30" NA
我认为您可以(应该)避免 for
循环和在不需要时使用外部库。
所以这可能是一个解决方案:
// create data
vect1 <- c("Andy+Pete", "Mary + Pete", "Pete+ Amada", "Amada + Steven", "Steven + Henry")
// create a matrix of pairs with removed white spaces
pairsMatrix <- do.call(rbind, sapply(vect1, function(v) strsplit(gsub(pattern = " ", replacement = "", x = v), "\+")))
// remove dimnames (not necessary though)
dimnames(pairsMatrix) <- NULL
// for all line of the pairsMatrix, find if second element is somewhere else first element. Bind that with the previous pairs
allPairs <- do.call(rbind, c(list(pairsMatrix), apply(pairsMatrix, 1, function(names) c(names[1], pairsMatrix[names[2]==pairsMatrix[,1], 2]))))
// filter for oneself-relationships
allPairs[allPairs[,1]!=allPairs[,2],]
[,1] [,2]
[1,] "Andy" "Pete"
[2,] "Mary" "Pete"
[3,] "Pete" "Amada"
[4,] "Amada" "Steven"
[5,] "Steven" "Henry"
[6,] "Andy" "Amada"
[7,] "Mary" "Amada"
[8,] "Pete" "Steven"
[9,] "Amada" "Henry"
关于您的最后一点,我认为使用适当的 Date
对象进行简单排序即可。
我正在研究 R 中的一个简单问题(但我还没有弄明白;p):
给定一个向量 vect1 <- c("Andy+Pete", "Mary + Pete", "Pete+ Amada", ..., "Amada + Steven", "Steven + Henry")
。我想创建一个新向量 vect2
,其中包含 vect1
中的所有元素和 共享以下内容的新元素 属性:对于每两个字符串"A+B"
和 "B+C"
,我们将其连接成 "A+C"
,并将这个新元素添加到 vect2
。谁能帮我做这个吗?
另外,我想获取所有每个字符串中站在+
前面的元素,下面的代码正确吗?
for (i in length(vect1)){
vect3[i] <- regexpr(".*+", vect1[i])
}
第 3 个问题:如果我有一个数据框 d
,其中有一个 Date
列,格式为 %d-%b
(例如,01-Apr
),我该如何排序基于 Date
的递增顺序的数据帧??假设 d <- c(
01-Apr,
01-Mar,
02-Jan,
31-June,
30-May)
.
我认为应该这样做,但我做了一些我可能不应该做的事情...比如增长对象和嵌套 for
循环。如果要访问“+”前面的所有元素,只需使用 name.matrix[,1]
.
vect1 <- c("Andy+Pete", "Mary + Pete", "Pete+ Amada","Amada + Steven", "Steven + Henry")
library(stringr)
name.matrix <- matrix(do.call('rbind',str_split(vect1, pattern = "\s?[+]\s?")), ncol = 2)
new.stuff <- c()
for(x in unique(name.matrix[,2])){
sub.mat.1 <- matrix(name.matrix[name.matrix[,2] == x,], ncol = 2)
sub.mat.2 <- matrix(name.matrix[name.matrix[,1] == x,], ncol = 2)
if(length(sub.mat.1) && length(sub.mat.2)){
for(y in seq_along(sub.mat.1[,2])){
new.add <- paste0(sub.mat.1[y,1],'+', sub.mat.2[,2])
new.stuff <- c(new.stuff, new.add)
}
}
}
vect2 <- c(vect1, new.stuff)
vect2
#[1] "Andy+Pete" "Mary + Pete" "Pete+ Amada" "Amada + Steven" "Steven + Henry" "Andy+Amada"
#[7] "Mary+Amada" "Pete+Steven" "Amada+Henry"
更新:
第三个问题。那么六月只有 30 天。所以你会在那里得到一个 NA。如果您尝试根据日期对 data.frame 进行排序,则需要使用格式 df[order(df$Date),]
。 lubridate
包在处理日期时也可能有帮助。
d <- c('01-Apr','01-Mar','02-Jan','31-June','30-May')
d.new <- as.Date(d, format = '%d-%b')
d.new <- d.new[order(d.new)]
d.new
#[1] "2018-01-02" "2018-03-01" "2018-04-01" "2018-05-30" NA
我认为您可以(应该)避免 for
循环和在不需要时使用外部库。
所以这可能是一个解决方案:
// create data
vect1 <- c("Andy+Pete", "Mary + Pete", "Pete+ Amada", "Amada + Steven", "Steven + Henry")
// create a matrix of pairs with removed white spaces
pairsMatrix <- do.call(rbind, sapply(vect1, function(v) strsplit(gsub(pattern = " ", replacement = "", x = v), "\+")))
// remove dimnames (not necessary though)
dimnames(pairsMatrix) <- NULL
// for all line of the pairsMatrix, find if second element is somewhere else first element. Bind that with the previous pairs
allPairs <- do.call(rbind, c(list(pairsMatrix), apply(pairsMatrix, 1, function(names) c(names[1], pairsMatrix[names[2]==pairsMatrix[,1], 2]))))
// filter for oneself-relationships
allPairs[allPairs[,1]!=allPairs[,2],]
[,1] [,2]
[1,] "Andy" "Pete"
[2,] "Mary" "Pete"
[3,] "Pete" "Amada"
[4,] "Amada" "Steven"
[5,] "Steven" "Henry"
[6,] "Andy" "Amada"
[7,] "Mary" "Amada"
[8,] "Pete" "Steven"
[9,] "Amada" "Henry"
关于您的最后一点,我认为使用适当的 Date
对象进行简单排序即可。