R 如果组有多个因子级别,是否将新列创建为长数据格式?
我想根据每个因素的级别数,为我的长格式数据子集并重新创建一个新列 例如,站点R 如果组有多个因子级别,是否将新列创建为长数据格式?,r,dataframe,dplyr,R,Dataframe,Dplyr,我想根据每个因素的级别数,为我的长格式数据子集并重新创建一个新列 例如,站点a可以具有距离b20或b5,但站点b和c只有一个距离值(b20) 如果有更多的因素,我的新列source应保留值“unclark”,如果只有一个因素,则使用相应行中的距离值 # Dummy data frame df<- data.frame(year = c(1,1,2,1,5,5,10), distance = c("b20", "b5", "b20", "b20", "PA",
a
可以具有距离b20
或b5
,但站点b
和c
只有一个距离值(b20
)
如果有更多的因素,我的新列source
应保留值“unclark”,如果只有一个因素,则使用相应行中的距离
值
# Dummy data frame
df<- data.frame(year = c(1,1,2,1,5,5,10),
distance = c("b20", "b5", "b20", "b20", "PA", "b5", "PA"),
site = c("a", "a", "b", "c", "d", "d", "e"))
> df
year distance site
1 1 b20 a # `a` has more than 1 distances => source == unclear
2 1 b5 a
3 2 b20 b
4 1 b20 c
5 5 PA d # `d` has more than 1 distances => source == unclear
6 5 b5 d
7 10 PA e
我们可以使用一个简单的
ifelse
语句
library(dplyr)
df %>%
group_by(site) %>%
mutate(source = ifelse(n_distinct(distance) == 1, as.character(distance[1]), 'unclear'))
这就给了,
#一个tible:7 x 4
#组别:网站[5]
年距离站点源
1 b20 a不清楚
2 1 b5 a不清楚
3 2 b20 b b20
4 1 b20 c b20
5帕d不清楚
6 5 b5 d不清楚
7.10帕埃帕
带有
数据的选项。表
将首先创建“距离”列的副本作为“源”,获取行索引(.I
),其中唯一“距离”元素的长度不等于1,按“站点”分组并分配(:=
)。将“来源”改为“不清楚”
library(data.table)
i1 <- setDT(df)[, source := distance][, .I[uniqueN(distance) != 1], site]$V1
df[i1, source := 'unclear'][]
# year distance site source
#1: 1 b20 a unclear
#2: 1 b5 a unclear
#3: 2 b20 b b20
#4: 1 b20 c b20
#5: 5 PA d unclear
#6: 5 b5 d unclear
#7: 10 PA e PA
库(data.table)
i1df%>%groupby(site)%%>%filter(n_distinct(distance)==1)
@RonakShah,谢谢你的回答,但我已经对我的问题做了实质性的修改。也许你也知道如何解决这个问题?
# A tibble: 7 x 4
# Groups: site [5]
year distance site source
<dbl> <fct> <fct> <chr>
1 1 b20 a unclear
2 1 b5 a unclear
3 2 b20 b b20
4 1 b20 c b20
5 5 PA d unclear
6 5 b5 d unclear
7 10 PA e PA
library(data.table)
i1 <- setDT(df)[, source := distance][, .I[uniqueN(distance) != 1], site]$V1
df[i1, source := 'unclear'][]
# year distance site source
#1: 1 b20 a unclear
#2: 1 b5 a unclear
#3: 2 b20 b b20
#4: 1 b20 c b20
#5: 5 PA d unclear
#6: 5 b5 d unclear
#7: 10 PA e PA
df<- data.frame(year = c(1,1,2,1,5,5,10),
distance = c("b20", "b5", "b20", "b20", "PA", "b5", "PA"),
site = c("a", "a", "b", "c", "d", "d", "e"),
stringsAsFactors = FALSE)