如何解决dplyr case_when跨组时
我有df
var request = service.Files.Get(item.Id);
var rootfolder = uploadPathList.FirstOrDefault(i =>i.Id == parentId);
MemoryStream stream1 = new MemoryStream();
string FolderPath = Environment.CurrentDirectory + "/";
// Add a handler which will be notified on progress changes.
// It will notify on each chunk download and when the
// download is completed or failed.
request.MediaDownloader.ProgressChanged += (Google.Apis.Download.IDownloadProgress progress) =>{
switch (progress.Status) {
case DownloadStatus.Downloading:
{
Console.WriteLine(progress.BytesDownloaded);
break;
}
case DownloadStatus.Completed:
{
apiService.FileUpload(stream1,item.Name,rootfolder.Path);
using(System.IO.FileStream file = new FileStream(FolderPath + "/" + item.Name,FileMode.Create,FileAccess.ReadWrite)) {
if (file.Length > 0) {
stream1.WriteTo(file);
}
}
Console.WriteLine("Download complete.");
break;
}
case DownloadStatus.Failed:
{
Console.WriteLine("Download failed.");
break;
}
}
};
apiService.FileUpload(stream1,rootfolder.Path);
//DownloadFromDrive(service,item.Id,)
request.Download(stream1);
和两个向量:
df = data.frame(
group = c(rep("A",3),rep("B",3)),vt = c("SO:0001574","SO:0001619","SO:0001821")
)
我想产生一个输出:
tier_1 = c("SO:0001574","SO:0001575")
tier_2 = c("SO:0001821","SO:0001822")
即我想生成第三列ct,它根据tier_1或tier_2中是否存在vt列来填充,以便给定组中的所有行都填充有该层类型。
我尝试过:
group vt ct
1 A SO:0001574 tier_1
2 A SO:0001619 tier_1
3 A SO:0001619 tier_1
4 B SO:0001619 tier_2
5 B SO:0001619 tier_2
6 B SO:0001821 tier_2
但这仅填充单个行,而不填充组中的所有行:
df %>%
dplyr::group_by(group) %>%
dplyr::mutate(tier = dplyr::case_when(
vt %in% tier_1 ~ "tier_1",vt %in% tier_2 ~ "tier_2"))
解决方法
在any
中包装代码,以使每个组获得一个逻辑值:
library(dplyr)
df %>%
group_by(group) %>%
mutate(tier = case_when(
any(vt %in% tier_1) ~ "tier_1",any(vt %in% tier_2) ~ "tier_2"))
# group vt tier
# <chr> <chr> <chr>
#1 A SO:0001574 tier_1
#2 A SO:0001619 tier_1
#3 A SO:0001619 tier_1
#4 B SO:0001619 tier_2
#5 B SO:0001619 tier_2
#6 B SO:0001821 tier_2
,
在您描述了第一步之后,您还可以在fill()
中使用{tidyr}
:
library(tidyr)
library(dplyr)
df = data.frame(
group = c(rep("A",3),rep("B",3)),vt = c("SO:0001574","SO:0001619","SO:0001821")
)
tier_1 = c("SO:0001574","SO:0001575")
tier_2 = c("SO:0001821","SO:0001822")
df %>%
group_by(group) %>%
mutate(tier = case_when(
vt %in% tier_1 ~ "tier_1",vt %in% tier_2 ~ "tier_2")) %>%
fill(tier,.direction = "updown") %>%
ungroup()
# A tibble: 6 x 3
# Groups: group [2]
# group vt tier
# <chr> <chr> <chr>
#1 A SO:0001574 tier_1
#2 A SO:0001619 tier_1
#3 A SO:0001619 tier_1
#4 B SO:0001619 tier_2
#5 B SO:0001619 tier_2
#6 B SO:0001821 tier_2
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。