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)

i1
df%>%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)