r - 循环遍历数据框中的元素并根据条件添加一行
问题描述
我有一个这样的数据框:
> df <- data.frame(var1 = c("1 Merge 2 ","3"),
+ var2 = c("1","2 Merge 3"),
+ var3 = "1")
> df
var1 var2 var3
1 1 Merge 2 1 1
2 3 2 Merge 3 1
当' Merge '在一个元素中时,我想用' Merge '之前和之后的字符串来分割行。我希望这个被概括,所以如果我们有1 Merge 2 Merge 3
,应该有 3 行输出。
这是我想要的上述输出的示例:
> desired_df <- data.frame(var1 = c("1","2","3","3"),
+ var2 = c("1","1","2","3"),
+ var3 = c("1","1","1","1"))
> desired_df
var1 var2 var3
1 1 1 1
2 2 1 1
3 3 2 1
4 3 3 1
更新:
另一种情况是当我们有多个包含“合并”的列时:
> df
var1 var2 var3
1 1 Merge 2 Merge 4 1 1 Merge 2
2 3 2 Merge 3 1
> desired_df <- data.frame(var1 = c(1,1,2,2,4,4,3,3),
+ var2 = c(1,1,1,1,1,1,2,3),
+ var3 = c(1,2,1,2,1,2,1,1))
> desired_df
var1 var2 var3
1 1 1 1
2 1 1 2
3 2 1 1
4 2 1 2
5 4 1 1
6 4 1 2
7 3 2 1
8 3 3 1
解决方案:
我们可以separate_rows()
像这样使用管道和每个变量:
df %>%
separate_rows(var1, sep = " Merge ") %>%
separate_rows(var2, sep = " Merge ") %>%
separate_rows(var3, sep = " Merge ")
解决方案
您可以使用tidyr::separate_rows()
.
library(tidyr)
df %>%
separate_rows(var1:var3, sep = " Merge ")
var1 var2 var3
1 1 1 1
2 2 1 1
3 3 2 1
4 3 3 1
您可以通过将扩展示例放入循环中来获得所需的结果,尽管我确信有更好的方法:
for(i in seq_along(df)) {
df <- separate_rows(df, i, sep = " Merge ")
}
df
var1 var2 var3
1 1 1 1
2 1 1 2
3 2 1 1
4 2 1 2
5 3 2 1
6 3 3 1
推荐阅读
- javascript - React 组件 - 元素 | 不明确的
- angular - 二进制有问题:错误:模块没有自注册
- java - 如何通过 Spring 将消息重新排队到 Rabbit MQ 队列的后端
- r - 如何将具有离散值范围的数值向量转换为因子?
- python - 函数 `matplotlib.pyplot.isinteractive` 和 `matplotlib.is_interactive` 是否相同?
- r - 如何编写一个函数来检查 grepl 中的非常规字符的字符串?
- server - 如何使用 CLI 将具有多个资源的模块添加到 WildFly
- android - 我可以在 android studio 中为我的应用添加新的文本样式吗?
- linux - 如何运行仅将标准输入、标准输出和标准错误附加到另一个正在运行的进程的进程
- python - pandas:使用 is_monotonic_increasing 遍历多个列