首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用dplyr更新R中的值以对行进行子集

使用dplyr更新R中的值以对行进行子集
EN

Stack Overflow用户
提问于 2017-02-12 02:53:47
回答 1查看 130关注 0票数 1

我想知道是否可以更新满足某些条件的所有行的值,这些条件是我使用过滤器选择的

我试着从这里开始:

代码语言:javascript
复制
|Disaster     | TVal | FVal|
|-------------|------|-----|
|Tornado      | 0    | 0   |
|Fire         | 0    | 0   |
|Fire Tornado | 0    | 0   |

到这里:

代码语言:javascript
复制
|Disaster     | TVal | FVal|
|-------------|------|-----|
|Tornado      | 1    | 0   |
|Fire         | 0    | 1   |
|Fire Tornado | 0.5  | 0.5 |

我像这样选择行

代码语言:javascript
复制
foo %>%  filter(grepl("TORNADO", Disaster))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-12 03:04:07

根据输出,base R选项将'Disaster‘列拆分为空格,在对其进行unlist ( 'un1’)后获得unique元素,然后循环‘un1’(sapply(..),使用grepl从'Disaster‘列获得逻辑向量,将输出除以输出的行和(addmargins创建sum列),并将输出分配给'foo’的第2列和第3列

代码语言:javascript
复制
un1 <- unique(unlist(strsplit(foo$Disaster, "\\s+")))
m1 <- addmargins(sapply(un1, function(x) grepl(x, foo$Disaster)),2)
foo[2:3] <-  m1[,1:2]/m1[,3]
foo
#      Disaster TVal FVal
#1      Tornado  1.0  0.0
#2         Fire  0.0  1.0
#3 Fire Tornado  0.5  0.5

数据

代码语言:javascript
复制
foo <- structure(list(Disaster = c("Tornado", "Fire", "Fire Tornado"
 ), TVal = c(0L, 0L, 0L), FVal = c(0L, 0L, 0L)), .Names = c("Disaster", 
"TVal", "FVal"), class = "data.frame", row.names = c(NA, -3L))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42179903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档