public static char stringIterator(String string) {
char lastChar = string.charAt(0);
for(int i = string.length()-1 ;i>=0;i--) {
System.out.println(string);//Keep this line
lastChar = string.charAt(i);
if (string.length() == 1 || lastChar == 'M') {
break;
} else {
string = string.substring(0, i);
}
}
return lastChar;
}
我想从df1和df2中选择第1行。 df1和df2中的第2行。 df1和df2的第3行。 df1和df2的第4行。我可以使用下面的代码来做到这一点,但想知道当有数百行时是否有更简单的方法来做到这一点?我总是从两个df中寻找匹配的行,并希望将它们配对。
> df1
n1 mt1
1 Mike 48
2 John 64
3 Steve 32
4 Dan 87
> df2
n1 mt1
1 Peter 32
2 Chris 23
3 Brendan 44
4 Joseph 52
答案 0 :(得分:3)
我们可以从基数R中使用Map
并为df1
和df2
子集以及rbind
创建一个行索引序列。但是,请确保df1
和df2
的行数相等,否则可能会得到一些意外的结果。
Map(function(x, y) rbind(df1[x, ], df2[x, ]), 1:nrow(df1), 1:nrow(df2))
#[[1]]
# n1 mt1
#1 Mike 48
#11 Peter 32
#[[2]]
# n1 mt1
#2 John 64
#21 Chris 23
#[[3]]
# n1 mt1
#3 Steve 32
#31 Brendan 44
#[[4]]
# n1 mt1
#4 Dan 87
#41 Joseph 52
我们还可以将每一行split
放入数据帧列表,然后rbind
Map(rbind, split(df1, 1:nrow(df1)), split(df2, 1:nrow(df2)))
purrr
版本是
purrr::map2(split(df1, 1:nrow(df1)), split(df2, 1:nrow(df2)), rbind)
由于行数相同,我们也可以使用lapply
lapply(1:nrow(df1), function(x) rbind(df1[x, ], df2[x, ]))
答案 1 :(得分:2)
使用split
df=rbind(df1,df2)
split(df,rep((seq.int(nrow(df1))),2)) # or split(df,c(seq.int(nrow(df1)),seq.int(nrow(df2))))
$`1`
n1 mt1
1 Mike 48
11 Peter 32
$`2`
n1 mt1
2 John 64
21 Chris 23
$`3`
n1 mt1
3 Steve 32
31 Brendan 44
$`4`
n1 mt1
4 Dan 87
41 Joseph 52
答案 2 :(得分:0)
另一种直观的实现方法是使用for
循环
df1 <- data.frame(n1=c('Mike','John','Steve','Dan'),
mt1=c(48,64,32,87), stringsAsFactors = F)
df2 <- data.frame(n1=c('Peter','Chris','Brendan','Joseph'),
mt1=c(32,23,44,52), stringsAsFactors = F)
for (i in 1:nrow(df1)) {
assign(paste0("m", i), rbind(df1[i, ], df2[i, ]))
}
这将创建几个新的数据帧-在这种情况下为m1,m2,m3和m4-每个数据帧都具有来自df1和df2的相应行。