我有一个csv文件,我必须从中获取来自特定coloumn的超过2个字符的行。我的csv文件看起来像这样
"Name" "Age" "ID" "RefID"
"ABC" "12" "Abccc" "xyzw"
"AAA" "14" "A" "X"
"BBB" "18" "DEfff" "dfg"
"CCY" "10" "F" "XY"
"CCZ" "20" "R" "XYC"
因此,从第3列和第4列开始,我选择了> =两个字符的行。
我尝试了以下方式
data = read.table(file ='res.csv', header = T)
dat2 = as.character(data[,3])
ind = dat2[(which(nchar(dat2) >=2)),]
但是它给了我错误,我无法找到如何同时处理两个cols。 我的结果应该如下
"Name" "Age" "ID" "RefID"
"ABC" "12" "Abccc" "xyzw"
"BBB" "18" "DEfff" "dfg"
"CCY" "10" "F" "XY"
"CCZ" "20" "R" "XYC"
任何帮助都是适当的
答案 0 :(得分:2)
我们可以避免多个步骤,即通过在character
中指定stringsAsFactors = FALSE
来转换为read.table
类,以避免将字符列转换为factor
类。然后,使用nchar
获取第三列的字符数,并通过比较它是否大于或等于2来创建逻辑条件
data[nchar(data[,3])>=2,]
# Name Age ID RefID
#1 ABC 12 Abccc xyzw
#3 BBB 18 DEfff dfg
对于多列,请使用&
data[nchar(data[,3])>=2 & data[,4] >=2,]
但是,当有100列时,它会变得有点困难。为此,我们遍历感兴趣的列,进行比较并将Reduce
转换为单个逻辑vector
data[Reduce(`&`, lapply(data[3:4], function(x) nchar(x) >=2)),]
# Name Age ID RefID
#1 ABC 12 Abccc xyzw
#3 BBB 18 DEfff dfg
如果any
列的条件需要为TRUE,请将&
中的|
更改为Reduce
data[Reduce(`|`, lapply(data[3:4], function(x) nchar(x) >=2)),]
# Name Age ID RefID
#1 ABC 12 Abccc xyzw
#3 BBB 18 DEfff dfg
#4 CCY 10 F XY
#5 CCZ 20 R XYC
data <- read.table(file ='res.csv', header = TRUE, stringsAsFactors = FALSE)
答案 1 :(得分:0)
这是一个基于data.table的解决方案。 stringsAsFactors = FALSE
是data.table::fread
中的默认值。
require(data.table)
x=
fread('"Name" "Age" "ID" "RefID"
"ABC" "12" "Abccc" "xyzw"
"AAA" "14" "A" "X"
"BBB" "18" "DEfff" "dfg"
"CCY" "10" "F" "XY"
"CCZ" "20" "R" "XYC"')
x[nchar(ID)>2 | nchar(RefID)>2]
Name Age ID RefID
1: ABC 12 Abccc xyzw
2: BBB 18 DEfff dfg
对于OR
(|
)情况,您还可以根据名称和年龄以及基于nchar的子集进行融合。
这是一个单行:
z = melt(x, id.vars = c('Name', 'Age'))[nchar(value) > 2 ]
z
Name Age variable value
1: ABC 12 ID Abccc
2: BBB 18 ID DEfff
3: ABC 12 RefID xyzw
4: BBB 18 RefID dfg
5: CCZ 20 RefID XYC