使用公共元素连接两个字符串

时间:2018-03-01 18:53:57

标签: r string concat

我正在处理一个简单的问题在R (但我还没想到它; p):

给出一个向量vect1 <- c("Andy+Pete", "Mary + Pete", "Pete+ Amada", ..., "Amada + Steven", "Steven + Henry")。我想创建一个新的向量vect2,其中包含vect1 共享以下属性的新元素中的所有元素:每两个字符串"A+B"和{ {1}},我们将其连接到"B+C"并将此新元素添加到"A+C"中。有人可以帮我这么做吗?

另外,我想在每个字符串中的vect2前面加上所有元素,以下代码是否正确?

+

第3个问题:如果我的数据框for (i in length(vect1)){ vect3[i] <- regexpr(".*+", vect1[i]) }的{​​{1}}列格式为d(例如,Date),我该如何订购此数据框?基于%d-%b ??的递增顺序我们只是说01-Apr 01-Apr Date 01-Mar d <- c( 02-Jan , 3月31日, 30-May {{1} }}

2 个答案:

答案 0 :(得分:1)

我认为应该这样做,但我做了我可能不应该做的事情......比如增长对象和嵌套foreach($tuitionAndFees as $tuitionAndFee){ echo $tuitionAndFee->revenue } 循环。如果您想访问&#39; +&#39;前面的所有元素,只需使用for

name.matrix[,1]

更新

第三个问题。那么六月份只有30天。所以你要在那里获得NA。如果它是您尝试根据日期排序的数据框架,则您需要使用格式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" 。使用日期时,df[order(df$Date),]包也可能会有所帮助。

lubridate

答案 1 :(得分:1)

我认为如果不需要,你可以(应该)避免使用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对象进行简单排序就可以了。