替换子集化数据帧的前100行的值

时间:2017-03-16 12:07:13

标签: r dataframe

我有一个像这样的数据框

gender <- sample( c("M","F"), 10000, replace=TRUE, prob=c( 0.5, 0.5) )
handed <- sample( c("L","R"), 10000, replace=TRUE, prob=c( 0.2, 0.8) )
data <- data.frame(gender=gender,handed=handed)

我需要替换来自此子集的前100行

d <- subset(data,gender=="M" & handed=="R",)

我知道

da <- head(d,n=100)

但我不知道如何在data中替换它们。

我想将其替换为:

gender=="F" & handed=="L

我尝试过这个解决方案:

Conditions_Seperator<-function(condition){return (unlist(strsplit(condition, "")))}
  con<-Conditions_Seperator("MR")
  replaceing_con<-Conditions_Seperator("FL")

      library(data.table)
      setDT(data)[data[,  .I[gender==as.character(con[1]) &  handed == as.character(con[2])][1:size_to_decrease]],
                  c('gender', 'handed') := .(as.character(replaceing_con[1]), as.character(replaceing_con[2]))][]

,输出为:

      handed
gender    L    R    M
     F 6122   95 3592
     M   96   95    0

它为我的数据集添加了一列

3 个答案:

答案 0 :(得分:2)

我们可以尝试找到前100&#34; TRUE&#34;的位置。具有whichhead的值,并使用这些索引对原始数据框中的行进行子集化,并通过生成要使用rep更新的值的向量来更新它们。

subs <- head(which(data$gender=="M" & data$handed=="R"), 100)
data[subs, ] <- rep(c("F", "L"), each = 100)

只是为了重现性,这是一个包含10行且仅更新2行的小例子。

set.seed(24)
gender <- sample( c("M","F"), 10, replace=TRUE, prob=c( 0.5, 0.5) )
handed <- sample( c("L","R"), 10, replace=TRUE, prob=c( 0.2, 0.8) )
data <- data.frame(gender=gender,handed=handed)
data
#   gender handed
#1       F      R
#2       F      R
#3       M      R
#4       M      R
#5       M      R
#6       M      L
#7       F      R
#8       M      R
#9       M      R
#10      F      R

subs <- head(which(data$gender=="M" & data$handed=="R"), 2)
subs
#[1] 3 4
data[subs, ] <- rep(c("F", "L"), each = 2)
data
#   gender handed
#1       F      R
#2       F      R
#3       F      L
#4       F      L
#5       M      R
#6       M      L
#7       F      R
#8       M      R
#9       M      R
#10      F      R

答案 1 :(得分:2)

这是使用双下标的第二个基本R方法。

使用ronak-shah的数据,我们从

开始
with(data, table(gender, handed))
      handed
gender L R
     F 0 4
     M 1 5

每组,然后使用

data[data$gender=="M" & data$handed=="R",][1:2,] <- data.frame(gender="F", handed="L")
用左撇子女性取代前两名右撇子男性。我们最终得到了

with(data, table(gender, handed))
      handed
gender L R
     F 2 4
     M 1 3

答案 2 :(得分:1)

以下是使用data.table

的一个选项
library(data.table)
setDT(data)[data[,  .I[gender=="M" &  handed == "R"][1:100]],
                        c('gender', 'handed') := .('F', 'L')][]
#       gender handed
#    1:      F      R
#    2:      F      R
#    3:      M      L
#    4:      F      L
#    5:      M      L
#   ---              
# 9996:      F      R
# 9997:      F      R
# 9998:      F      R
# 9999:      M      L
#10000:      M      R

更新问题

setDT(data)[data[, .I[gender==con[1] & handed == con[2]][seq_len(size_to_decrease)]],
      c('gender', 'handed') := .(replaceing_con[1], replaceing_con[2])][]

table(data)
#      handed
#gender    L    R
#     F 1068 4075
#     M  986 3871