% fill(id) %>% fil-6ren">
gpt4 book ai didi

r - 从 R 中的行创建 ID 列

转载 作者:行者123 更新时间:2023-12-02 16:45:02 24 4
gpt4 key购买 nike

我有以下数据框:

输入:

df <- data.frame(a=c('id','a','b','c','d','id','a','b','c','d','id','a','b','c','d','id','a','b','c','d','id','a','b','c','d'),
value=c(1,'a1','b1','c1','d1',2,'a2','b2','c2','d2',3,'a3','b3','c3','d3',4,'a4','b4','c4','d4',5,'a5','b5','c5','d5'),
)

我想创建新的列 id 并且第一个 id 下面的行应该分配到那个 id 下。

期望的输出:

output <- data.frame(id=c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5),
var=c('a','b','c','d','a','b','c','d','a','b','c','d','a','b','c','d','a','b','c','d'),
value=c('a1','b1','c1','d1','a2','b2','c2','d2','a3','b3','c3','d3','a4','b4','c4','d4','a5','b5','c5','d5'))

注意:该解决方案也适用于以下情况:

df <- data.frame(a=c('id','a','b','c','d','id','a','b','c','d','id','a','b','c','d','id','a','b','c','d','id','a','b','c','d'),
value=c('id1','a1','b1','c1','d1','id12','a2','b2','c2','d2','idd3','a3','b3','c3','d3','i44','a4','b4','c4','d4','i15','a5','b5','c5','d5')
)

expected_output <- data.frame(id=c('id1','id1','id1','id1','id12','id12','id12','id12','idd3','idd3','idd3','idd3','i44','i44','i44','i44','i15','i15','i15','i15'),
var=c('a','b','c','d','a','b','c','d','a','b','c','d','a','b','c','d','a','b','c','d'),
value=c('a1','b1','c1','d1','a2','b2','c2','d2','a3','b3','c3','d3','a4','b4','c4','d4','a5','b5','c5','d5'))

最佳答案

根据您的修改,我认为这是可行的:

library(dplyr)
library(tidyr)
df %>%
mutate(id = ifelse(a == "id", as.character(value), NA)) %>%
fill(id) %>%
filter(a != "id")
# a value id
# 1 a a1 id1
# 2 b b1 id1
# 3 c c1 id1
# 4 d d1 id1
# 5 a a2 id12
# 6 b b2 id12
# 7 c c2 id12
# 8 d d2 id12
# 9 a a3 idd3
# 10 b b3 idd3
# 11 c c3 idd3
# 12 d d3 idd3
# 13 a a4 i44
# 14 b b4 i44
# 15 c c4 i44
# 16 d d4 i44
# 17 a a5 i15
# 18 b b5 i15
# 19 c c5 i15
# 20 d d5 i15

使它通用的规则不是很清楚。第一种情况,a == "id" 对应的value 不是以字母"id"开头的,你想加在上面。

第二种情况比较困惑,有些值以“id”开头,有些只是以“i”开头,什么都不加。我不明白为什么“i44”和“idd3”一样是一个很好的 ID,但不是“1”。我最好的猜测是以“i”开头的任何内容都可以,否则我们将粘贴在“id”上。我们可以在一个简单的后处理步骤中做到这一点。我使用“以 'i' 开头”作为标准,我会留给您根据实际标准进行调整。

df %>%
mutate(id = ifelse(a == "id", as.character(value), NA_character_)) %>%
fill(id) %>%
filter(a != "id") %>%
mutate(id = ifelse(grepl("^i", id), id, paste0("id", id)))

以上内容符合您对两个输入的预期输出。

关于r - 从 R 中的行创建 ID 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60725381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com