我有一张桌子,如下:
[,1] [,2] [,3] [,4] [,5]
[1,] a A 0.06 0.31 -1.5
[2,] b B -0.75 0.2 0.02
[3,] c C 1.58 -0.02 1.5
我想在第3列至第5列上加上一个截断值,以查找其绝对值大于1的单元格。
我也想用绝对值和不符合条件的单元格用“ NA”填充匹配值。
为此,我正在使用dplyr软件包中的过滤器功能,但无法获得所需的结果。有谁知道我该怎么做。
这是输出的外观:
[,1] [,2] [,3] [,4] [,5]
[1,] a A NA NA 1.5
[2,] b B NA NA NA
[3,] c C 1.58 NA 1.5
谢谢!
答案 0 :(得分:2)
一个人可以尝试将dplyr::mutate_at
用作:
library(dplyr)
df %>% mutate_at(vars(3:5), funs(ifelse(abs(.) > 1, abs(.), NA_integer_)))
或如果数据具有factor
类型的列,请尝试:
df %>% mutate_at(vars(3:5), funs(ifelse(abs(as.numeric(as.character(.))) > 1,
abs(as.numeric(as.character(.))), NA_integer_)))
# V1 V2 V3 V4 V5
# 1 a A NA NA 1.5
# 2 b B NA NA NA
# 3 c C 1.58 NA 1.5
数据:
df <- read.table(text="
a A 0.06 0.31 -1.5
b B -0.75 0.2 0.02
c C 1.58 -0.02 1.5",
stringsAsFactors = FALSE)
答案 1 :(得分:1)
您只能使用R这样的基本函数来做到这一点:
> dat <- read.table(text="a A 0.06 0.31 -1.5
b B -0.75 0.2 0.02
c C 1.58 -0.02 1.5", header=FALSE)
> dat[,3:5][abs(dat[,3:5])<=1]<-NA
> dat[,3:5] <- abs(dat[,3:5])
> dat
V1 V2 V3 V4 V5
1 a A NA NA 1.5
2 b B NA NA NA
3 c C 1.58 NA 1.5
答案 2 :(得分:1)
这是一个base R
选项
df[3:5] <- lapply(df[3:5], function(x) replace(x, abs(x) < 1, NA))
df
# V1 V2 V3 V4 V5
#1 a A NA NA -1.5
#2 b B NA NA NA
#3 c C 1.58 NA 1.5
df <- structure(list(V1 = c("a", "b", "c"), V2 = c("A", "B", "C"),
V3 = c(0.06, -0.75, 1.58), V4 = c(0.31, 0.2, -0.02), V5 = c(-1.5,
0.02, 1.5)), .Names = c("V1", "V2", "V3", "V4", "V5"),
class = "data.frame", row.names = c(NA, -3L))
答案 3 :(得分:0)
dat <- read.table(text="
a A 0.06 0.31 -1.5
b B -0.75 0.2 0.02
c C 1.58 -0.02 1.5", header=FALSE)
dat[3:5] = abs(dat[3:5])
is.na(dat[3:5]) = dat[3:5]<1
dat
V1 V2 V3 V4 V5
1 a A NA NA 1.5
2 b B NA NA NA
3 c C 1.58 NA 1.5