Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将函数应用于数据帧的每一列_R - Fatal编程技术网

R 将函数应用于数据帧的每一列

R 将函数应用于数据帧的每一列,r,R,我需要在多列数据框中转换数据,并想找到一种方法,一次在数据框的所有列中进行转换。数字数据的数据转换似乎没有问题。例如: df <- data.frame( co1 = c(5,9,6,1,6), co2 = c(8,5,4,6,2), co3 = c(6,5,4,1,2), co4 = c(6,1,5,3,2), co5 = c(5,1,2,6,8)) df 5为“是”,所有其他为“否”): for(1中的i:ncol(df)){ df[i]5,“是”、“否”) }

我需要在多列数据框中转换数据,并想找到一种方法,一次在数据框的所有列中进行转换。数字数据的数据转换似乎没有问题。例如:

df <- data.frame(
  co1 = c(5,9,6,1,6),
  co2 = c(8,5,4,6,2), 
  co3 = c(6,5,4,1,2),
  co4 = c(6,1,5,3,2),
  co5 = c(5,1,2,6,8))
df 5为“是”,所有其他为“否”):

for(1中的i:ncol(df)){
df[i]5,“是”、“否”)
}
或者,更简单地说,使用索引:

df[] <- ifelse(df > 5, "yes", "no")
df[]5,“是”、“否”)
但是,当我有字符数据时,这些方法不起作用。例如,我想将此数据框中以“A”开头的所有值转换为“是”:

df <- data.frame(
  co1 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")),
  co2 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")), 
  co3 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")),
  co4 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")),
  co5 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")))
df
  co1 co2 co3 co4 co5
1  JF  GB  ID  EB  DF
2  IA  DD  DA  IF  HD
3  HI  IH  JE  CH  FB
4  GE  JI  CJ  BA  GE
5  BG  EE  GG  AJ  BH

df使用
dplyr
,我们可以:

 df %>% 
  mutate_all(function(x) ifelse(grepl("^B",x),"Yes","No"))
  co1 co2 co3 co4 co5
1 Yes  No Yes  No  No
2  No  No  No  No  No
3  No  No  No  No  No
4  No  No  No  No  No
5  No  No  No  No Yes
关于post中的数据(df1):

数据:


如果您想坚持基本R,
lappy
将在这里工作:

set.seed(123)
df <- data.frame(
  co1 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")),
  co2 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")), 
  co3 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")),
  co4 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")),
  co5 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")))

df2 <- as.data.frame(lapply(df, function(x) ifelse(grepl("^B", x), "yes", "no")))

  co1 co2 co3 co4 co5
1  CA  JI  IH  JE  BB
2  HE  EC  GE  IG  DC
3  DH  FA  FI  FB  ID
4  GD  IJ  JC  HC  CJ
5  FC  AF  DA  AH  AF

  co1 co2 co3 co4 co5
1  no  no  no  no yes
2  no  no  no  no  no
3  no  no  no  no  no
4  no  no  no  no  no
5  no  no  no  no  no
set.seed(123)

df我们可以
取消列出
数据,然后直接使用
grepl
在基数R中建立索引

df[] <- c("No", "Yes")[grepl("^B", unlist(df)) + 1]

df
#  co1 co2 co3 co4 co5
#1  No  No  No  No  No
#2  No Yes  No  No  No
#3  No  No  No Yes  No
#4  No  No  No  No  No
#5  No  No  No  No Yes

df[]带有
substr的
base R
中的选项

out <- array("No", dim = dim(df), dimnames = dimnames(df))
out[substr(as.matrix(df), 1, 1) == "B"] <- "Yes"

out
ifelse
with
lapply/sapply/mutate\u all
可能会有帮助;但是我得到了这个错误:mutate_impl(.data,dots)中的错误:求值错误:
as_dictionary()
从rlang 0.3.0开始就失效了。请改用
作为\u data\u代词()。我使用的是最新的dplyr版本。我今天更新了该软件包,并运行了与您相同的代码。您的dplyr版本是什么,加载了哪些其他软件包?我使用的是会话中唯一的软件包
dplyr
0.8.2。我刚刚卸载了dplyr并重新安装了它,但出现了以下错误:错误:loadNamespace中的“dplyr”的软件包或命名空间加载失败(另外需要j=2.0.2):警告消息:软件包“dplyr”是在R版本3.4.4下构建的
df1 %>% 
   mutate_all(function(x) ifelse(grepl("^B",x),"Yes","No"))
  co1 co2 co3 co4 co5
1  No  No  No  No  No
2  No  No  No  No  No
3  No  No  No  No  No
4  No  No  No Yes  No
5 Yes  No  No  No Yes
df
  co1 co2 co3 co4 co5
1  BH  IC  BC  HJ  CC
2  CC  DH  CF  GI  HI
3  DB  GE  JI  DA  GD
4  II  CA  EJ  IG  FA
5  JD  JB  IG  EB  BE
set.seed(123)
df <- data.frame(
  co1 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")),
  co2 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")), 
  co3 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")),
  co4 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")),
  co5 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")))

df2 <- as.data.frame(lapply(df, function(x) ifelse(grepl("^B", x), "yes", "no")))

  co1 co2 co3 co4 co5
1  CA  JI  IH  JE  BB
2  HE  EC  GE  IG  DC
3  DH  FA  FI  FB  ID
4  GD  IJ  JC  HC  CJ
5  FC  AF  DA  AH  AF

  co1 co2 co3 co4 co5
1  no  no  no  no yes
2  no  no  no  no  no
3  no  no  no  no  no
4  no  no  no  no  no
5  no  no  no  no  no
df[] <- c("No", "Yes")[grepl("^B", unlist(df)) + 1]

df
#  co1 co2 co3 co4 co5
#1  No  No  No  No  No
#2  No Yes  No  No  No
#3  No  No  No Yes  No
#4  No  No  No  No  No
#5  No  No  No  No Yes
set.seed(12345)
df <- data.frame(
  co1 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")),
  co2 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")), 
  co3 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")),
  co4 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")),
  co5 = c(paste(sample(LETTERS[1:10],5), sample(LETTERS[1:10],5), sep = "")))

df
#  co1 co2 co3 co4 co5
#1  HB  AE  ED  HD  HD
#2  JC  BD  CG  AH  DA
#3  GE  FI  HE  BI  JI
#4  IF  JB  JB  EE  FH
#5  CG  CF  DC  CA  BJ
out <- array("No", dim = dim(df), dimnames = dimnames(df))
out[substr(as.matrix(df), 1, 1) == "B"] <- "Yes"
df <- structure(list(co1 = structure(c(2L, 4L, 1L, 3L, 5L), .Label = c("BF", 
"CH", "EC", "HB", "JJ"), class = "factor"), co2 = structure(c(3L, 
1L, 4L, 5L, 2L), .Label = c("AD", "FI", "GA", "HH", "JB"), class = "factor"), 
    co3 = structure(c(1L, 5L, 4L, 3L, 2L), .Label = c("CJ", "DB", 
    "EF", "FH", "IG"), class = "factor"), co4 = structure(c(2L, 
    4L, 3L, 1L, 5L), .Label = c("AE", "DH", "HA", "IF", "JC"), class = "factor"), 
    co5 = structure(c(1L, 5L, 3L, 2L, 4L), .Label = c("AC", "BG", 
    "EE", "GI", "JJ"), class = "factor")), 
    class = "data.frame", row.names = c(NA, 
-5L))