You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于条件在R语言DataFrame中新增行?附实操示例

解决方案:基于条件在DataFrame中新增行

你想要的是当from列值不为"0"时,为对应行新增一条记录:用户与原行一致,projects列等于原行的from值,from列保持原行的值。下面提供两种常用的实现方法:

方法1:使用tidyverse(dplyr + tibble)

这种方法代码逻辑直观,适合熟悉tidyverse风格的用户:

# 加载所需工具包
library(dplyr)
library(tibble)

# 定义原始数据框
df1 <- data.frame( 
  users=c("1", "1", "2", "2"), 
  projects=c("100", "101", "102", "103"), 
  from=c("0", "111", "0", "106")
)

# 生成目标数据框
df2 <- df1 %>%
  rowwise() %>%
  # 按行处理:如果from非0则生成2行数据,否则保留原行
  mutate(output_rows = list(
    if (from != "0") {
      tibble(
        users = users,
        projects = c(projects, from),
        from = c(from, from)
      )
    } else {
      tibble(users = users, projects = projects, from = from)
    }
  )) %>%
  # 将列表列展开为多行
  unnest(output_rows) %>%
  # 清理列名并取消行分组
  select(-c(projects, from)) %>%
  rename(projects = projects...2, from = from...3) %>%
  ungroup() %>%
  # 重置行号(可选,让结果更整洁)
  mutate(row_id = row_number()) %>%
  select(-row_id)

# 查看最终结果
print(df2)

这种方法的优势是严格按行逻辑处理,能完美保留原始行的顺序,且代码可读性较强。

方法2:使用原生Base R

如果你不想加载额外工具包,用原生R也能轻松实现需求:

# 定义原始数据框
df1 <- data.frame( 
  users=c("1", "1", "2", "2"), 
  projects=c("100", "101", "102", "103"), 
  from=c("0", "111", "0", "106")
)

# 筛选需要新增行的记录,并修改projects列的值为from列的值
new_rows <- df1[df1$from != "0", ]
new_rows$projects <- new_rows$from

# 合并原始数据和新增行,按用户排序确保原行在前、新增行在后
df2 <- rbind(df1, new_rows)
df2 <- df2[order(df2$users, df2$from == "0"), ]

# 重置行名,让结果更规范
rownames(df2) <- NULL

# 查看最终结果
print(df2)

这个方法的核心是先提取需要扩展的行,修改后再合并回原数据,最后通过排序保证行的顺序符合预期。

两种方法最终生成的df2都会和你预期的结构完全一致:

usersprojectsfrom
11000
1101111
1111111
21020
2103106
2106106

内容的提问来源于stack exchange,提问作者Thaciana G O Cerqueira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:47:56