r - 根据条件创建新列
问题描述
我有一个以下格式的数据框
如果用户购买了一件新商品,他将获得唯一的id
价值,如果同一用户购买了另一件商品,则child
该列具有上一个id
。
df <- data.frame(id= c('s123','s1004','s1009','s1010'),child = c("",'s123','s1004',""))
> df
id child
1 s123
2 s1004 s123
3 s1009 s1004
4 s1010
现在我想创建新列parent
并具有初始 id 值
expect_df <- data.frame(id= c('s123','s1004','s1009','s1010'),child = c("",'s123','s1004',""),parent = c('s123','s123','s123','s1010'))
> expect_df
id child parent
1 s123 s123
2 s1004 s123 s123
3 s1009 s1004 s123
4 s1010 s1010
解决方案
数据:(确保您的输入条目是characters
而不是 factors
,确保您""
是NA
)
df <- data.frame(id= c('s123','s1004','s1009','s1010'),child = c(NA,'s123','s1004',NA),stringsAsFactors = F)
代码:
df$parent <- NA
repeat {
sid <- df$id[which(is.na(df$parent))[1]]
df$parent[apply(df,1,function(x){x<-na.omit(x);if(any(x%in%sid)){sid<<-c(sid,x);T;}else{F}})] <- sid[1]
if (all(!is.na(df$parent))) break
}
结果:
# id child parent
# 1 s123 <NA> s123
# 2 s1004 s123 s123
# 3 s1009 s1004 s123
# 4 s1010 <NA> s1010
推荐阅读
- java - 使用自定义接收器从数据集中接收流数据 [Spark Streaming]
- jmeter - 在 jmeter 中,同一脚本的 2 次不同测试运行的请求数可以改变吗?如果是这样,为什么会这样?
- javascript - 如何在所有文档片段中获取元素
- authentication - Jmeter - 是否可以使用 cookie 进行授权
- r - Kmean分割后如何分离簇
- javascript - 在 PhpStorm 上,如何在 PHP 文件上显示 JS/CSS 错误
- typo3 - 为什么我得到一个糟糕,发生错误!当我试图在我的共享主机上进行全新安装时?
- javascript - 使用 .spilt() 从数组中删除双引号
- xdebug - XDebug Speed - 为什么这么慢 (v2.6.2 -> 2.8.0b2)
- android - Android LinearLayout 不可见