存在一个正在卸载的数据帧,其中包含大量行(数万行)。问题是日期框架加载不正确——数据中有空白。
的例子:
df <- data.frame(Region=c(NA,'region2','region1',NA,'region3','region3',NA,'region5'), Event=c('region1','event1','event1','region2','event1','event1','region4','event1'), Campaign=c('event1','campaign2','campaing1','event1','campaing1','campaign2','event1',NA))
我需要计算每个Region
对应Event
的数量。我所发现的就是应用这样的代码:
df <- df %>%
select(Region, Event) %>%
group_by(Region, Event) %>%
summarise(Event = n())
但是正如你所理解的,这并不能解决问题:)因为它留下了很多缺失的数据…
但是在这个日期框架中,我们看到一个特定的模式被保留了-在区域列之后总是有一个事件列! 事件(总是相同的,但是有许多区域) .
在这种情况下如何使用R来计算每个区域的所有事件?
据我所知,你的主要问题是在你的数据行。有些行在第一列中有一个空白,然后在第二列中以第一个的值开始。
df
Region Event Campaign
1 <NA> region1 event1
2 region2 event1 campaign2
3 region1 event1 campaing1
4 <NA> region2 event1
5 region3 event1 campaing1
6 region3 event1 campaign2
7 <NA> region4 event1
8 region5 event1 <NA>
一种可能的纠正方法是,将数据作为两个部分来处理。一个是每列的正确值分配,另一个是有问题的值,这些值被纠正,最后所有内容都绑定在一起进行分析:
library(dplyr)
dfn <- df %>%
# lets get the problematic values first
dplyr::filter(is.na(Region)) %>%
# migrate values between columns
dplyr::transmute(Region = Event,
Event = Campaign,
Campaign = NA) %>%
# bind the data with correct allocations
dplyr::union_all(dplyr::filter(df, !is.na(Region)))
# now the analysis should give the wanted results
dfn %>%
dplyr::count(Region)
Region n
1 region1 2
2 region2 2
3 region3 2
4 region4 1
5 region5 1
根据注释,是获取"event1"之前的列值的另一种方法。出现次数(同一行)
df %>%
# work the data row wise
dplyr::rowwise() %>%
# look up content in vector of column content of that row, subtract 1 and look this up the the vector of all column content
dplyr::mutate(res = c(Region, Event, Campaign)[match("event1", c(Region, Event, Campaign)) - 1]) %>%
# release row binding (prevents unwanted behaviour down stream)
dplyr::ungroup() %>%
# count
dplyr::count(res)
# A tibble: 5 x 2
res n
<chr> <int>
1 region1 2
2 region2 2
3 region3 2
4 region4 1
5 region5 1