我有一个看起来像这样的数据框
Name Cricket Football Swimming
A Y Y N
B N Y N
C Y N Y
我想要一个遍历所有列并使用如下列名标记每个条目的代码:
Name Cricket Football Swimming Sports
A Y Y N Cricket and Football
B N Y N Football Only
C Y N Y Cricket and Swimming
我有一个使用ifelse()的想法,但是如果数据帧的列数增加并且我需要动态的东西,而我并不需要每次都更改它,那将很繁琐。
请帮助!!
答案 0 :(得分:4)
一种选择是将数据gather
转换为“长”格式,filter
按“名称”分组的带有“ Y”的行,将元素粘贴到“键”中({{1 }})和str_c
与原始数据集
left_join
library(tidyverse)
df1 %>%
gather(key, val, -Name) %>%
filter(val == 'Y') %>%
group_by(Name) %>%
summarise(Sports = str_c(key, collapse= ' and ')) %>%
left_join(df1) %>%
select(names(df1), "Sports")
# A tibble: 3 x 5
# Name Cricket Football Swimming Sports
# <chr> <chr> <chr> <chr> <chr>
#1 A Y Y N Cricket and Football
#2 B N Y N Football
#3 C Y N Y Cricket and Swimming
答案 1 :(得分:1)
(在R中)这样的事情也可以做到:
df$Sports <- apply(df[,-1]=="Y", 1, function(r) paste(names(df)[-1][r], collapse=" and "))
# Name Cricket Football Swimming Sports
#1 A Y Y N Cricket and Football
#2 B N Y N Football
#3 C Y N Y Cricket and Swimming